Fragen und Antworten zum C-Kurs
Re: Fragen und Antworten zum C-Kurs
Es wird nur das Grundsätzliche abdecken. Aber für den Anfang hilft es weiter. In der Kopfzeile steht jeweils dir URL. Zum Teil finden sich auch Querverweise im Text. Darüber kann man dann weiter suchen. Bei der Introduction... des z88dk habe ich die Texte der tool Querverweise hinten angehängt. Das erspart den Übergang ins Web.
Re: Fragen und Antworten zum C-Kurs
Mit dem neuen Beispiel einer °F => °C Umrechnung bietet es sich an, mit Hi-Tech C auf meinem ZPM3-System eine Übersetzung zu wagen. Das Programm schicke ich hierzu per Copy-und-Paste seriell auf die andere Seite. Auf dem Laptop dient gtkterm als Sendestelle, auf der CPM-Seite wird der Empfang mit DEVICE CONIN:=CRT,TTY parallel zur Keyboard-Eingabe geschaltet. Damit die Daten nicht einfach auf der Kommandozeile landen, starte ich meinen Lieblings-Editor mit: VEDIT TEMPERAT.C. Damit der C-Code auf die CPM-Seite gelangt, mit der Maus per Copy der Text aufgenommen und ins Termial-Fenster per Paste abladen. Mit 2 mal ESC gelangt man auf die Kommandozeile von VEDIT und mit dem EX-Befehl wird abgespeichert - fertig. Der Editor wird im Anschluß automatisch beendet. HI-TECH C liegt bei mir auf Image 8, welches wiederum auf Laufwerk B gemountet ist. Dort befindet sich auch TEMPERAT.C. Die Übersetzung erfolgt mit C309-16 TEMPERAT.C -LF Der Parameter '-LF' ist hier notwendig, da sonst die Floating-Point Routinen nicht hinzugelink werden. Die wurden laut Handbuch in eine separate Library ausgelagert. In der Standard-Library sind nur die Integer-Routinen. Die Übersetzung dauert 12,5sec. (bei 25MHz CPU-Clk & 120kB Transferrate von/zur SD-Karte) - z88dk auf dem Laptop ist quasi instantan fertig - was nicht verwundert. Das Ergebnis entspricht dem in CPM-Box: 72.000000 Grad Fahrenheit sind 22.222226 Grad Celsius (bis auf die '6' in der letzten Stlle bei den °C. HI-TECH C rechnet nur mit einfach genauen Floats. Erstaunlich ist das Verhalten von TEMPERAT.COM aus der z88dk-v1.8 Übersetzung unter ZPM3 (immerhin wurde mit '+cpm' für CPM übersetzt). Während in CPM-Box alles normal verläuft, stürzt das ZPM3 nach Ausgabe der Umrechnung kommentarlos auf der Kommandozeile nach dem nächsten <cr> ab ! Das etwas nicht stimmt, kündigte sich allerdings per System-Prompt schon an. statt >B0: stand nach der Text-Ausgabe dort >R186 (???). z88dk-v2.3 habe ich nicht ausprobiert, da hier nicht wichtig. Meine Absicht ist, einmal die Sache aus CPM-Sicht zu zeigen, denn HI-TECH C bildet ANSI-C ab und kann durchaus mithalten. Einziger Wermutstropfen ist die Größe des ge-crunch-ten LBR-Archives mit 624kByte. Ausgepackt werden 1,284MByte belegt (bei 4KB Block-Größe). Es werden daher zwei 720k-Laufwerke mindestens benötigt.
HI-TECH C gibt's auf GITHUB: https://github.com/agn453/HI-TECH-Z80-C
HI-TECH C gibt's auf GITHUB: https://github.com/agn453/HI-TECH-Z80-C
Re: Fragen und Antworten zum C-Kurs
Die Leiden mit den deutschen Sonderzeichen:
Hab' ich wohl vergessen in der PROFILE.SUB zu ändern.
Aber davon einmal abgesehen läuft's gut...
Was mit der ersten Stelle hinterm Komma los ist, verstehe ich noch nicht ganz, aber schon interessant.
Ändert man Zeile 11 in einaus.c auf printf("\nDie Flaeche betraegt: %2.4e\n", flaeche); wird die erste Stelle hinterm Komma eine Zahl. Da spinnt wohl printf() der Vers. 2.3 etwas. Ist wohl doch zu bleeding edge...
Hab' ich wohl vergessen in der PROFILE.SUB zu ändern.

Aber davon einmal abgesehen läuft's gut...

Was mit der ersten Stelle hinterm Komma los ist, verstehe ich noch nicht ganz, aber schon interessant.

Ändert man Zeile 11 in einaus.c auf printf("\nDie Flaeche betraegt: %2.4e\n", flaeche); wird die erste Stelle hinterm Komma eine Zahl. Da spinnt wohl printf() der Vers. 2.3 etwas. Ist wohl doch zu bleeding edge...

Re: Fragen und Antworten zum C-Kurs
Ja, die eckigen und geschweiften Klammern sehen mit den deutschen Tastatureinstellungen auf der Joyce "ungewohnt" aus...
Aber wir entwickeln und editieren ja auf dem PC (Stichwort Cross Compiler), und da haben wir dieses Umlauteproblem nicht (dafür ein anderes - dazu später mehr).
Bei mir sieht die Ausgabe von einaus.com so aus:

Aber wir entwickeln und editieren ja auf dem PC (Stichwort Cross Compiler), und da haben wir dieses Umlauteproblem nicht (dafür ein anderes - dazu später mehr).
Bei mir sieht die Ausgabe von einaus.com so aus:
Re: Fragen und Antworten zum C-Kurs
Status: temperat.com funktioniert. Nicht das ich daran gezweifelt hätte, nur zum Nachverfolgen wo ich bin.
einaus.com ebenfalls.
Vielen Dank Bernd und gerne "weiter so"
einaus.com ebenfalls.
Vielen Dank Bernd und gerne "weiter so"

Re: Fragen und Antworten zum C-Kurs
Hallo Paul,
danke für's Feedback. Das hält mich motiviert weiterzumachen.
danke für's Feedback. Das hält mich motiviert weiterzumachen.

Re: Fragen und Antworten zum C-Kurs
Sehr gerne Bernd.
Nachdem ich die Grafik Demo noch per copy und Paste ans laufen brachte tippe ich inzwischen lieber alles selbst. Das prägt sich deutlich besser ein.
Nebenher schreibe ich im Moment noch für den Raspberry Pico in C so das jede Auffrischung sehr willkommen ist.
Es ist doch inzwischen über 20 Jahre her das ich C und C++ beruflich benötigt habe.
Nachdem ich die Grafik Demo noch per copy und Paste ans laufen brachte tippe ich inzwischen lieber alles selbst. Das prägt sich deutlich besser ein.
Nebenher schreibe ich im Moment noch für den Raspberry Pico in C so das jede Auffrischung sehr willkommen ist.
Es ist doch inzwischen über 20 Jahre her das ich C und C++ beruflich benötigt habe.
Re: Fragen und Antworten zum C-Kurs
Ich habe mir hier den Programmierkurs insofern etwas erweitert, als ich versuche, das ganze remote auf der Joyce zu erledigen. Also den Kurs auf dem PC lesen und die Beispiele verfolgen. Diese sollen dann remote auf die Joyce gehen (per DEVICE die Seriele parallel zu Tastatur und dem Bildschirm). Tippen per Tastatur ist da das Einfachste. Bei Copy-und-Paste hakt es jedoch noch etwas mit der Übertragung. Ich verwende den TE als Editor (z. Zt. habe ich keinen anderen auf der Joyce). Der TE zickt leider etwas, die Zeichen kommen ihm wohl zu schnell und das Ergebnis entspricht dann nicht unbedingt dem gewünschten. Hier kommt der Lerneffekt ins Spiel, in Form des Korrekturlesens.
Läßt man einmal die Betriebsprobleme außer acht, die mit dem Kurs eigentlich nichts zu tun haben - aber den Lernstoff deutlich auflockern
, ist der Kurs sehr interessant und macht Spaß. Der Umfang der Beispiele ist genau richtig, das Tempo mit neuen Lektionen auch.
Die 'fertigen' Beispiele übersetzt mir dann mit HI-Tech C, welches ich wegen der Paketgröße von >720k auf zwei Disketten-Images verteilen mußte. Nachdem auch noch die Hürde mit dem Auffinden der Include-Dateien auf Laufwerk B: gelöst ist, funktioniert alles ganz prima. Der Compiler wollte doch ganz gern wissen, das er ebenfalls auf B: suchen soll. Das Regelt der zusätzliche Parameter '-I 0:B:' beim Compiler-Aufruf. Das Lesen des vielfach unterschätzten Handbuches hilft doch enorm


Die 'fertigen' Beispiele übersetzt mir dann mit HI-Tech C, welches ich wegen der Paketgröße von >720k auf zwei Disketten-Images verteilen mußte. Nachdem auch noch die Hürde mit dem Auffinden der Include-Dateien auf Laufwerk B: gelöst ist, funktioniert alles ganz prima. Der Compiler wollte doch ganz gern wissen, das er ebenfalls auf B: suchen soll. Das Regelt der zusätzliche Parameter '-I 0:B:' beim Compiler-Aufruf. Das Lesen des vielfach unterschätzten Handbuches hilft doch enorm

Re: Fragen und Antworten zum C-Kurs
Moin Bernd,
hier müßtest Du nachbessern:
z wird nicht mit '0' sondern '3' initialisiert.
Eine Frage zu den Endlosschleifen: Hier wäre vermutlich der Eindeutigkeit wegen die Variante 2 oder 3 zu bevorzugen, da durch das 'true' sofort ersichtlich ist, das es hier endlos im Kreis zugehen wird. Bei der for-Schleife wäre das nur aus der besonderen Schreibweise ersichtlich, also in Kenntnis dieser Sonderform. Es könnte aber auch ein Copy-und-Paste Fehler sein, wenn an einem größeren Programm gearbeitet wird.
hier müßtest Du nachbessern:
Code: Alles auswählen
for (z = 3; z < grenze; z += 2) {
Der erste Ausdruck ist die Initialisierung. Sie wird einmalig zu Beginn der Schleife durchgeführt.
Hier wird die Variable z mit 0 initialisiert. Im ersten Schleifendurchlauf hat z also den Wert 0.
Eine Frage zu den Endlosschleifen: Hier wäre vermutlich der Eindeutigkeit wegen die Variante 2 oder 3 zu bevorzugen, da durch das 'true' sofort ersichtlich ist, das es hier endlos im Kreis zugehen wird. Bei der for-Schleife wäre das nur aus der besonderen Schreibweise ersichtlich, also in Kenntnis dieser Sonderform. Es könnte aber auch ein Copy-und-Paste Fehler sein, wenn an einem größeren Programm gearbeitet wird.
Re: Fragen und Antworten zum C-Kurs
Danke für den Hinweis, Kurt, ich hab's korrigiert.
Tatsächlich findet man die for-Endlosschleife am häufigsten vor. Das mag daran liegen, dass manche Compiler dann keinen unnötigen Bedingungs-Code einfügen, aber das wäre ein Thema für die Compiler-Optimierung. Die beiden Compiler des z88dk erzeugen allerdings denselben Code, egal welchen Schleifentyp man verwendet. Aus folgendem Code
wird jeweils folgender Assembler-Code:
sccz80:
zsdcc:
Tatsächlich findet man die for-Endlosschleife am häufigsten vor. Das mag daran liegen, dass manche Compiler dann keinen unnötigen Bedingungs-Code einfügen, aber das wäre ein Thema für die Compiler-Optimierung. Die beiden Compiler des z88dk erzeugen allerdings denselben Code, egal welchen Schleifentyp man verwendet. Aus folgendem Code
Code: Alles auswählen
#include <stdio.h>
int main(void)
{
for (;;) {
printf(".");
}
return 0;
}
Code: Alles auswählen
#include <stdio.h>
int main(void)
{
while (1) {
printf(".");
}
return 0;
}
Code: Alles auswählen
#include <stdio.h>
int main(void)
{
do {
printf(".");
} while (1);
return 0;
}
sccz80:
Code: Alles auswählen
; Function main flags 0x00000000 __stdc
; int main()
C_LINE 4,"endlos1.c::main::0::1"
._main
.i_2
ld hl,i_1+0
push hl
ld a,1
call printf
pop bc
jp i_2 ;EOS
.i_3
ld hl,0 ;const
ret
Code: Alles auswählen
; ---------------------------------
; Function main
; ---------------------------------
_main:
l_main_00102:
ld hl,___str_0
push hl
call _printf
pop af
jr l_main_00102
SECTION rodata_compiler
___str_0:
DEFM "."
DEFB 0x00
SECTION IGNORE