Fragen und Antworten zum C-Kurs

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
admin
Administrator
Beiträge: 20
Registriert: 08.02.2015, 11:19

Re: Fragen und Antworten zum C-Kurs

Beitrag von admin »

Paul hat geschrieben: 26.03.2023, 15:44 ...
Hast du eine Idee warum der Fehler nicht gemeldet wurde?
es wurde ja einfach nicht ausgeführt :?
Tja, manche Fehler werden halt nicht als Fehler erkannt. Funktionsaufrufe ohne Klammern gehören dazu; diesen Fehler meldet keiner der beiden Compiler des z88dk (sccz80 und zsdcc). Das Leben ist hart...
Paul hat geschrieben: 26.03.2023, 15:44 und F3TEST konnte ich zwar mit deinem zcc Aufruf erzeugen und starten,
es zeigt auch einen Bildschirm an, nimmt aber keine Tasten an.
Soll das so sein?
...
Die erste Testdatei forms3tst.c enthielt noch einen Fehler, den ich mittlerweile korrigiert habe; lade einfach die Datei forms3.zip erneut herunter. Ich frage mich allerdings, wie du sie überhaupt kompilieren konntest: du hättest einen Compile-Fehler bekommen müssen...

Ich wünsche dir auch einen schönen Rest-Sonntag!
Forumadministrator
kurt
Beiträge: 191
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Tja, manche Fehler werden halt nicht als Fehler erkannt.
Schräges Verhalten :( , der HTC macht's nämlich auch so. Würde deshalb sagen, dieser Fehler ist ein 'Hidden Feature' :?
Paul
Beiträge: 146
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

admin hat geschrieben: 26.03.2023, 20:34 Ich frage mich allerdings, wie du sie überhaupt kompilieren konntest: du hättest einen Compile-Fehler bekommen müssen...
ich habe ein S bei InitForms entfernt ;)
mit initforms(2,false); funktioniert aber deutlich besser ;)
kurt
Beiträge: 191
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Ich hab' mir den Assembler-Code einmal vom Compiler besorgt (nur bis zum Assemblerlauf laufen lassen). So wie's aussieht, wird der Funktionsaufruf bei fehlenden '()' als eine Art Label aufgefaßt:

Code: Alles auswählen

;1:CLSTEST.C: 18: int main(void) {                                      
global  _main                                                           
_main:                                                                  
call    ncsv                                                            
defw    f30

;1:CLSTEST.C: 19:     CLRSCR;   <== Funktionsaufruf ohne die '()'                                    
ld      hl,_CLRSCR	        <== es wird nur ein Addr.-Dummy geladen
                                                      
;1:CLSTEST.C: 33: }                                                     
l3:                                                                     
jp      cret			<== Rücksprung ohne CLRSCR auszuführen
                                                      
f30     equ     0
                                                       
psect   data                                                            
19:                                                                     
defb    66,101,102,111,114,101,32,67,76,83,10,0                         
29:                                                                     
defb    12,0                                                            
39:                                                                     
defb    10,10,83,99,114,101,101,110,32,99,108,101,97,114,101,100        
defb    32,33,0                                                         
Bei mir heißt die cLS-Funktion CLRSCR, damit ich die besser finde. Außerdem habe ich alles aus main entfernt, was nur stören würde. Es passiert anscheinend nichts wirklich schlimmes, wenn die '()' vergessen werden - außer natürlich der kahlen Stelle am Kopf des Programmierers :lol:
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Die fehlenden Klammern werden nicht als Fehler moniert, weil der Funktionsname auch ohne die Klammern syntaktisch korrekt ist: es handelt sich dann um einen function pointer, also einen Zeiger auf eine Funktion. Ohne Zuweisung macht sie wenig Sinn, ist aber auch nicht falsch.
kurt
Beiträge: 191
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Danke für die Erklärung. Da steckt also noch weiterer Lernstoff hinter, vermute ich :)
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Ja, Kurt, da gibt's noch so einiges... ;)

Was ist denn mit schombi? Ist der noch dabei?
kurt
Beiträge: 191
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Sind womöglich Schulferien bei ihm ausgebrochen ? Auf der A7 Richtung Norden war bei mir die Tage das gelebte Chaos auf der Strecke.
Paul
Beiträge: 146
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Hallo Bernd, ich habe ein paar Fragen zu den "magic numbers" die du in fileio.c verwendest.
Das liest sich immer einfach, aber woher bekomme ich sie?
- die Größe des Buffers. Du wählst 100, die längste Zeile ist 86. Man könnte auch 255 verwenden. Aber was ist mit Buffer von 20? Wie kann ich in Etappen einlesen wenn mein Puffer kleiner ist als eine ganze Zeile?
- Die Größe der t_line objekte. Für den Staat reservierst du 60, für die Stadt 50, sind zusammen 110, mehr als jede Zeile.
Das sind für die Programmierung wichtige Werte aber woher bekomme ich die?
Paul
Beiträge: 146
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Ich möchte auch noch mal etwas genauer auf die Parameter von Parseline() eingehen.
Das mit line habe ich verstanden. Beim Aufruf mit parseLine(buf, &line); gebe ich die Adresse von Line weiter, also einen Pointer. Somit kann der Inhalt von line verändert werden, z.B. mit Initline
Was geschieht mit buf? Wird beim Aufruf der gesamte Buffer kopiert? Das wäre dann ja vergleichsweise langsam, erklärt aber warum der buf vom main nicht verändert werden kann.
Ist es dann sinnvoll die resultierende Variable mit dem gleichen Namen zu versehen? Intuitiv hätte ich lbuf verwendet was eine lokale Kopie von buf andeutet.

Bei Parsetoken wiederum übergibst du die lokale Kopie von buf und gibst ihr den Namen start, was ja wiederum eine lokale kopie von buf ist, genauso wie field und delimiter.
du veränderst start, was erstmal keine Auswirkung hat weil es ja eine lokale Kopie ist. Am ende erhöhst du noch start um eins und gibst es als rückgabewert zurück.
Spannender wird es mit field. Das veränderst du und gibst am ende noch das Stringende Zeichen hinzu. Aber ist es nicht genau wie start eine lokale Kopie?
Delimiter wird nicht verändert, also stellt sich auch keine Frage bezüglich der Auswirkung auf die aufrufende Parseline.
Antworten