Fragen und Antworten zum C-Kurs

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Paul hat geschrieben: 07.04.2023, 09:43 ...
- 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?
Ja, man könnte auch 255 verwenden. Oder 2000. Wenn man mit festen Feldgrößen arbeitet, muss man immer überlegen, wie groß der zu speichernde Inhalt eigentlich sein kann. Der Buffer muss groß genug sein, damit die längste Zeile hineinpasst, oder man muss vorsehen eine Zeile in mehreren Etappen einzulesen, wie du das nennst. Das macht das Einlesen komplizierter, weil man im ersten Anlauf nicht alle Felder bekommt und Felder über zwei Lesevorgänge geteilt sein können.
Ist die maximale Länge einer Zeile bekannt, z.B. weil man weiß, aus welcher Quelle die CSV-Datei stammt, dann kann man den Buffer entsprechend dimensionieren. Man muss aber beachten, dass man auch Platz für den Zeilenumbruch und das String-Ende-Zeichen vorsieht.
Paul hat geschrieben: 07.04.2023, 09:43 - 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?
Die 60 und die 50 sind zusammen zwar mehr als jede Zeile lang ist, aber wir haben ja viele Zeilen, und so kann in einer Staat besonders lang sein und in einer anderen die Stadt. Man muss jeweils genug Platz für das längste Feld reservieren.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Paul hat geschrieben: 07.04.2023, 09:52 ...
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.
In Kapitel 10.2 habe ich geschrieben, dass der Name eines Arrays auch ein Pointer ist. buf ist also nicht der Wert des Arrays mit all seinen 100 Characters, sondern der Pointer, der auf den ersten Character zeigt. buf ist also eine Adresse, nicht der ganze Array. Beim Aufruf einer Funktion mit buf als Parameter wird also nicht der ganze Buffer kopiert, sondern nur die zwei Bytes des Zeigers.
Paul hat geschrieben: 07.04.2023, 09:52 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.
Es wird die Adresse des Arrays übergeben, keine Kopie. Die Änderungen mit *start=... in parseToken ändern den Inhalt des Arrays buf in main.
Paul hat geschrieben: 07.04.2023, 09:52 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.
Diese Fragen sollten mit o.g. Erklärungen beantwortet sein.
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Hallo Bernd, gibst du uns bitte noch ein paar Aufgaben zum üben?
Ich habe mir inzwischen zu jeder Aufgabe eine Datei mit der Endung .BAT gemacht in dem der Befehl zum übersetzen steht damit ich nicht immer wieder experimentieren muss. Aktuell eine makeFile3.bat.
Haben wir schon Übergabeparameter benutzt? Das wäre doch recht praktisch zu wissen wie das geht.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Die Übungen zum C-Kurs werden in diesem Thema gesammelt. Auch eure Fragen und Lösungen sollen dort eingetragen werden. Nach einer gewissen Zeit werde ich eine Musterlösung anhängen.

Ich bin gespannt auf eure Mitarbeit! :)
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Ich möchte mich nochmal ganz herzlich bei Bernd bedanken.
Auch wenn der Kurs derzeit eingeschlafen ist.
Ich versuche grade einen ZX81 Emulator auf dem PICO RP2040 zu erweitern.
Der Kurs war dafür nicht nur lehrreich, ich konnte auch auf der Joyce einfach das Stringhandling ausprobieren.
So konnte ich vorab austesten wie ich aus dem Dateinamen die Startdaresse und die Länge extrahieren kann.
Beispiel: LOAD "DELPHI.BIN;8192:512" (die Länge ist nur ein Test, es kann weggelassen werden und die Dateilaenge verwendet werden. Sie wird aber verwendet für den Fall das man nicht die ganze Datei einlesen möchte)
Notwendig wird die Länge dann wenn ich abspeichere.
Ohne den Kurs hätte ich das nicht hinbekommen.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Paul hat geschrieben: 25.06.2023, 13:16 ...
Auch wenn der Kurs derzeit eingeschlafen ist.
...
Das mag am schönen Wetter liegen, der Kurs wird aber definitiv fortgesetzt. Es gibt noch mehrere Themen, die ich vorstellen möchte.
kurt
Beiträge: 188
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Das mag am schönen Wetter liegen,
Sicher nicht nicht nur daran. Ich befinde mich derzeit voll im Kampf gegen das Unkraut bzw. Rückschnitt der Sträucher etc.. Der viele Regen der letzten Tage tat ein übriges und hat Wachstumsaktivitäten an allen Ecken losgetreten... :roll:
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Meine Frage kommt sicher recht spät brennt mir trotzdem auf der "Seele".
Bei den absoluten Speicheradressen auf die man Variablen legen kann:
Gibt es eine Liste von sinnvollen Speicheradressen für die Joyce wie z.B. Systemvariablen aus denen man sinnvolles auslesen oder die man sinnvoll manipulieren kann so wie bei den ZX-Maschinen?
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Kann es sei das du dich vertippt hast Bernd?
bbock hat geschrieben: 18.08.2023, 10:10

Code: Alles auswählen

zcc +cpm -subtype=pcw80 -compiler=sccz80 -pragma-define:REGISTER_SP=0xF3FF -create-app testprg1.c -o testprg1.com
Die pragma-define-Option stellt sicher, dass der Stackpointer bei FFF0 beginnt. Damit bleibt der Speicherbereich ab F400 sicher vor Überschreibung durch den Stack.
Du wolltest wahrscheinlich schreiben das der Stackpointer bei F3FF nicht bei FFF0?
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Und gleich noch eine Frage hinterher:
beim zweiten Beispiel hast die Variable ch global definiert.
Ich wollte sie natürlich gleich lokal definieren was der compiler nicht mag.
Um so größer war meine Verwunderung das der Compiler die unveränderte Zeile als globale Variable akzeptiert.

Code: Alles auswählen

#include <stdio.h>

int main(void) {
    unsigned char *p;
    unsigned char ch @ 0xF402;
	
    p = (unsigned char *) 0xF400;
    *p = 23;
    ch = 16;
	
    printf("%d\n", *p);
    printf("%d\n", ch);
    printf("%d\n", *((unsigned char *) 0xF402));

    return 0;
}
ergibt eine Fehlermeldung:
absolute.c:5:22: error: Missing token, expecting ; got @
absolute.c:5:22: error: Invalid expression
absolute.c:5:24: fatal error: Expected ';'
Compilation aborted
während

Code: Alles auswählen

#include <stdio.h>

    unsigned char ch @ 0xF402;

int main(void) {
    unsigned char *p;
	
    p = (unsigned char *) 0xF400;
    *p = 23;
    ch = 16;
	
    printf("%d\n", *p);
    printf("%d\n", ch);
    printf("%d\n", *((unsigned char *) 0xF402));

    return 0;
}
sich problemlos übersetzen lässt :?
Antworten