Seite 9 von 11

Re: Fragen und Antworten zum C-Kurs

Verfasst: 26.03.2023, 20:34
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!

Re: Fragen und Antworten zum C-Kurs

Verfasst: 26.03.2023, 20:54
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' :?

Re: Fragen und Antworten zum C-Kurs

Verfasst: 26.03.2023, 22:57
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 ;)

Re: Fragen und Antworten zum C-Kurs

Verfasst: 26.03.2023, 23:21
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:

Re: Fragen und Antworten zum C-Kurs

Verfasst: 27.03.2023, 11:28
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.

Re: Fragen und Antworten zum C-Kurs

Verfasst: 27.03.2023, 15:09
von kurt
Danke für die Erklärung. Da steckt also noch weiterer Lernstoff hinter, vermute ich :)

Re: Fragen und Antworten zum C-Kurs

Verfasst: 31.03.2023, 13:53
von bbock
Ja, Kurt, da gibt's noch so einiges... ;)

Was ist denn mit schombi? Ist der noch dabei?

Re: Fragen und Antworten zum C-Kurs

Verfasst: 01.04.2023, 02:57
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.

Re: Fragen und Antworten zum C-Kurs

Verfasst: 07.04.2023, 09:43
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?

Re: Fragen und Antworten zum C-Kurs

Verfasst: 07.04.2023, 09:52
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.