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 »

kurt hat geschrieben: 19.03.2023, 10:37 Ich häng' mich mal mit obiger Anmerkung von Paul mit einer eigenen Frage hierzu dran. Bei meinen Aktivitäten mit dem HTC unter CPM habe ich das Problem, das ein "Hello World" regelmäßig ein 14K Binary erzeugt, egal was ich versuche. Es macht den Eindruck, als wenn per Default eine ganze Menge Zeugs standardmäßig mit eingebunden wird, obwohl sie eigentlich garnicht benutzt bzw. angefordert werden. Eben solche Sachen wie File-Operationen, Mathe-Funktion etc. Nur für die Ausgabe eines schnöden einzeiligen Textes ist das alles sicherlich nicht erforderlich. Beim Aufruf des C309 vom HTC-Paket startet anscheined ein Batch-Prozessor, der vordefiniert alle erforderlichen Schritte für die Übersetzung nacheinander abarbeitet. Beim zcc dürfte das nicht viel anders sein, wie es scheint. Dieser Batch-Prozess nimmt durchaus zusätzliche Parameter entgegen, aber anscheinend nicht so, das sich damit ein Ausschluß von unerwünschten Dingen im fertigen Binary erreichen läßt. Ich habe Dr. Google einmal hierzu bemüht und bin auf Hinweise gestoßen, das da ev. im C-Standard Papier (hoffe mal, ich formuliere das richtig) Vorgaben definiert sind, wie automatische Compilierung oder explizierte befehlszeilengesteuerte Übersetzung zu behandeln sind. Wenn ich also jeden Schritt einzeln anstoße, kann ich mehr Paramter angeben, die dann wohl auch beachtet werden. Mithin ist eine bessere Beeinflussung des Ergebnis (speicheroptimiert oder laufzeitoptimiert...) möglich.

Ist dazu etwas bekannt ?
Was der HTC so tut, weiß ich nicht. Ich kenne den Compiler nicht. Der zcc tut so einiges, darunter Compiler-Aufruf, Linker-Aufruf, Assembler-Aufruf, Optimizer-Aufruf, Disk-Image-Erzeugung, usw. Leider ist der zcc nicht ausführlich dokumentiert. Wenn man ganz genau wissen will, was er tut, dann muss man wohl in den Source Code des zcc schauen...
Je nach Compiler (und Linker) gibt es unterschiedliche Optionen. Was in allen C-Implementierungen gleich ist: zuerst wird der C-Präpozessor ausgeführt (die Präprozessor-Direktiven sind die Zeilen, die mit einem "#" beginnen), dann erst der eigentliche Compiler. Wie der dann den Code erzeugt, ist seine Sache. Viele C-Compiler - so auch die beiden vom z88dk unterstützten - erzeugen Assembler-Code und nicht direkt Maschinencode. D.h. nach dem Compile-Vorgang wird noch ein Assembler aufgerufen um das fertige Binary zu erhalten, welches schließlich vom Linker in eine ausführbare COM-Datei überführt wird. Und schlussendlich wird noch ein Disk-Image erzeugt, das die COM-Datei enthält.
kurt
Beiträge: 189
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Der zcc tut so einiges,
Der HTC macht es genauso, leider ist diese impliziete Batch-Bearbeitung etwas unübersichtlich, insbesondere wenn man (versuchsweise) Parameter angibt, die (scheinbar) wirkungslos bleiben (bin da halt etwas unbeleckt, deswegen ja auch die Kursusteilnahme). Das ich den HTC benutze, liegt an meinem "Arbeitsplatzrechner", auf dem ich wegen des 5 Jahre alten Linux-Systems nur eine (zu) alte z88dk Version installieren kann. Deshalb benutze ich den HTC auf meinem CPM-Rechner - der ist deutlich aktueller und auch ANSI :D Das nur zur Erklärung warum ich Bezug auf den HTC genommen habe. Der lange Textvorlauf ist auch nur deshalb, um zur Verdeutlichen worauf ich hinaus wollte. Das es mehrere Wege zum Ziel gibt, kommt nicht unerwartet, nur welche Vor-/Nachteile damit verbunden sind, ist eigentlich der Kern meiner Frage gewesen (wie z.B. Laufzeit- oder Speicheroptimiert), denn soetwas scheint bei der implizieten Batch-Verarbeitung nicht vorgesehen zu sein und ist wohl erst bei Ausführung der Einzelschritte möglich.
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Das Erstellen der Datei mit den FILE Operatoren fopen/fclose hat bei mir funktioniert.
Wie immer hatte ich das auch nicht bezweifelt.
Da ich nicht weiß wie der Witz "kommt ein pferd in eine bar..." weitergeht habe ich stattdessen
"das grüne nach oben ..." geschrieben.
Leider gibt die Joyce kein ü aus.
Wie bekomme ich Umlaute und sz auf der Joyce ausgegeben?
Irgendwo hatte Bernd einen Trick verwendet der funktionierte. Ich habe ihn jetzt nicht wiedergefunden und damals nicht wirklich verstanden.
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Danke noch für das gotoXY. 8-)
Auch das funktioniert erwartungsgemäß.
Jetzt werde ich gierig. Ein CLS wäre dabei noch sehr praktisch ;)
und die Zeichen um Rahmen zu malen :ugeek:
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.03.2023, 08:43 ...
Leider gibt die Joyce kein ü aus.
Wie bekomme ich Umlaute und sz auf der Joyce ausgegeben?
Irgendwo hatte Bernd einen Trick verwendet der funktionierte. Ich habe ihn jetzt nicht wiedergefunden und damals nicht wirklich verstanden.
Nehmen wir mal an, du möchtest das Wort "Größe" ausgeben - da ist sowohl ein Umlaut als auch das "scharfe S" drin. Das könntest du so machen:

Code: Alles auswählen

#define CH_SZ        126
#define CH_LC_OUML   124
...
printf("Gr%c%ce", CH_LC_OUML, CH_SZ);
Die beiden "%c"-Platzhalter stehen jeweils für ein Zeichen; diese werden durch die weiteren Parameter CH_LC_OUML (= 124) und CH_SZ (= 126) ausgefüllt. Das sind die Zeichen-Codes für "ö" und "ß".
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.03.2023, 08:45 ...
Jetzt werde ich gierig. Ein CLS wäre dabei noch sehr praktisch ;)
und die Zeichen um Rahmen zu malen :ugeek:
Hierzu möchte ich dich auf mein Forms3-Modul hinweisen: viewtopic.php?p=645#p645
In forms3.zip findest du input.h und input.c mit einigen nützlichen Funktionen und Definitionen, u.a. clearScreen(). Wenn du Rahmen malen möchtest, benötigst du eine Zeichentabelle, die du im Joyce-Handbuch findest. Oder du siehst dir mal box.h und box.c an; da ist bereits eine fertige Funktion zum Zeichnen von Rahmen drin (drawBox).

Sieht so aus, als würdest du bereits an einem eigenen Projekt basteln?
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Ein eigenes Projekt wäre übertrieben,
ich möchte einfach ein paar Sachen ausprobieren zum üben.
Bitte verrate noch wie ich die ganzen Form3 Sachen übersetzen kann.
zcc +cpm -subtype=pcw80 -lndos -create-app forms3tst.c -o forms3tst.com
hat nicht funktioniert
forms3tst.c:83:15: fatal error: Too few arguments to call to function 'initForms'
Compilation aborted

Davon abgesehen hatte ich das CLS schon versucht. Dazu fand ich ein funktionierendes Beispiel:

Code: Alles auswählen

/*
 *	Test the Native Console of the Amstrad PCW
 *
 *	23/3/2021 RobertK (based on ansivt52.c by Stefano)
 *
	Manual Index:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=170#manual

	Character Set:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=283#manual

	Terminal codes:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=308#manual
 */

#include <stdio.h>

void main()
{
    int x;

    printf("Before CLS\n");
    printf("\x1b\x45");	 // ESC E -> Clear screen
    printf("\x1b\x48");  // ESC H -> Home
    printf("If this is the first thing you can read, CLS is OK.\n");

    /* Draw an X */
    for (x = 0; x < 11; x++) {
		// ESC Y r c -> gotoxy
		printf("\x1b\x59%c%c*",32 + 10 + x, 32 + 20 + x);
		printf("\x1b\x59%c%c*",32 + 20 - x, 32 + 20 + x);
    }
}
Übersetzt mit zcc +cpm -subtype=pcw80 -lndos -create-app screen.c -o screen.com

Ich habe dann versucht das selber umzusetzen:

Code: Alles auswählen

#include <stdio.h>

void gotoXY(unsigned int x, unsigned int y) {
    putchar(27);        // ESC
    putchar('Y');       // cursor to position
    putchar(y + 32);    // row + 32
    putchar(x + 32);    // column + 32
}
void cLS() {
    printf("Before CLS\n");
    printf("\x1b\x45");	 // ESC E -> Clear screen
    printf("\x1b\x48");  // ESC H -> Home
    printf("Test\n");
 /* putchar(27);       // ESC
    putchar(69);       // cls
    putchar(27);       // ESC
    putchar(72);       // home
*/
}

int main(void) {
	cLS;
    putchar('A'); // oder printf("%s", "O");
    gotoXY(1,1);
    putchar('B'); // oder printf("%s", "O");
    gotoXY(2, 2);
    putchar('C'); // oder printf("%s", "O");
    gotoXY(14, 14);
    putchar('O'); // oder printf("%s", "O");
    gotoXY(80, 26);
    putchar('Z'); // oder printf("%s", "O");
}
Übersetzt mit zcc +cpm -subtype=pcw80 -lndos -create-app PrintAT.c -o PrintAT.com

Das funktioniert nicht.
es macht zwar HOME, aber der Bildschirm ist nicht leer.
Ich habe dann versucht die Printf vorher und hinterher hinzuzufügen.
Die werden aber auch nicht ausgegeben :cry:
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Das Manual habe ich nicht gefunden aber dies hier: https://en.wikipedia.org/wiki/Amstrad_C ... racter_set
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.03.2023, 11:33 ...Bitte verrate noch wie ich die ganzen Form3 Sachen übersetzen kann.
zcc +cpm -subtype=pcw80 -lndos -create-app forms3tst.c -o forms3tst.com
hat nicht funktioniert
forms3tst.c:83:15: fatal error: Too few arguments to call to function 'initForms'
Compilation aborted
Das Forms3-Projekt ist für Fortgeschrittene. :D Es besteht aus mehreren C-Dateien, du hast aber nur eine kompiliert. Der korrekte Aufruf ist:

zcc +cpm -subtype=pcw80 -lm -DAMALLOC -create-app forms3.c input2.c convert.c box.c forms3tst.c -o f3test.com

Hier wird eine Liste von C-Dateien als Quelle übergeben, die Mathematik-Bibliothek eingebunden und die automatische, dynamische Speicherverwaltung aktiviert. Du kannst forms3tst.c durch forms3tst_2.c ersetzen, dann mit z.B. f3test2.com als Ausgabedatei, um das zweite Beispiel zu übersetzen.
Paul hat geschrieben: 25.03.2023, 11:33 Davon abgesehen hatte ich das CLS schon versucht. Dazu fand ich ein funktionierendes Beispiel:

Code: Alles auswählen

/*
 *	Test the Native Console of the Amstrad PCW
 *
 *	23/3/2021 RobertK (based on ansivt52.c by Stefano)
 *
	Manual Index:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=170#manual

	Character Set:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=283#manual

	Terminal codes:
	https://www.manualslib.com/manual/1002846/Amstrad-Pcw8256.html?page=308#manual
 */

#include <stdio.h>

void main()
{
    int x;

    printf("Before CLS\n");
    printf("\x1b\x45");	 // ESC E -> Clear screen
    printf("\x1b\x48");  // ESC H -> Home
    printf("If this is the first thing you can read, CLS is OK.\n");

    /* Draw an X */
    for (x = 0; x < 11; x++) {
		// ESC Y r c -> gotoxy
		printf("\x1b\x59%c%c*",32 + 10 + x, 32 + 20 + x);
		printf("\x1b\x59%c%c*",32 + 20 - x, 32 + 20 + x);
    }
}
Übersetzt mit zcc +cpm -subtype=pcw80 -lndos -create-app screen.c -o screen.com

Ich habe dann versucht das selber umzusetzen:

Code: Alles auswählen

#include <stdio.h>

void gotoXY(unsigned int x, unsigned int y) {
    putchar(27);        // ESC
    putchar('Y');       // cursor to position
    putchar(y + 32);    // row + 32
    putchar(x + 32);    // column + 32
}
void cLS() {
    printf("Before CLS\n");
    printf("\x1b\x45");	 // ESC E -> Clear screen
    printf("\x1b\x48");  // ESC H -> Home
    printf("Test\n");
 /* putchar(27);       // ESC
    putchar(69);       // cls
    putchar(27);       // ESC
    putchar(72);       // home
*/
}

int main(void) {
	cLS;
    putchar('A'); // oder printf("%s", "O");
    gotoXY(1,1);
    putchar('B'); // oder printf("%s", "O");
    gotoXY(2, 2);
    putchar('C'); // oder printf("%s", "O");
    gotoXY(14, 14);
    putchar('O'); // oder printf("%s", "O");
    gotoXY(80, 26);
    putchar('Z'); // oder printf("%s", "O");
}
Übersetzt mit zcc +cpm -subtype=pcw80 -lndos -create-app PrintAT.c -o PrintAT.com

Das funktioniert nicht.
es macht zwar HOME, aber der Bildschirm ist nicht leer.
Ich habe dann versucht die Printf vorher und hinterher hinzuzufügen.
Die werden aber auch nicht ausgegeben :cry:
In C braucht jeder Funktionsaufruf Klammern, auch wenn die Funktion gar keine Argumente hat. In der ersten Zeile von main muss es also cLS(); heißen.

Das Home und das Clear screen kann man übrigens auch in einem einzigen printf machen.

Die Escape-Sequenzen stammen aus der Terminal-Emulation, und die ist im Joyce-Handbuch beschrieben. Hast du denn kein Joyce-Handbuch (eigentlich gibt es ja zwei)? Das ist z.B. im "90 GB"-Download von Dieter enthalten (unter Literatur > Manuale > System, glaube ich). Dort schau mal unter "Anhang III - Eigenschaften des Bildschirms" nach. Unter "ESC E" steht da: "Löscht das Darstellungsfeld. Die Position des Cursors bleibt davon unberührt."
Paul
Beiträge: 145
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Vielen Dank Bernd,
mein cLS() funktioniert jetzt.
Hast du eine Idee warum der Fehler nicht gemeldet wurde?
es wurde ja einfach nicht ausgeführt :?
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?
Schönen Rest-Sonntag wünsche ich.
Antworten