Fragen und Antworten zum C-Kurs

Software-Entwicklung, Compiler, Interpreter, ...
kurt
Beiträge: 163
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

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.
kurt
Beiträge: 163
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

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
kurt
Beiträge: 163
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Die Leiden mit den deutschen Sonderzeichen:

Bildschirmfoto_2023-02-18_11-28-45.png
Bildschirmfoto_2023-02-18_11-28-45.png (26.49 KiB) 2120 mal betrachtet

Hab' ich wohl vergessen in der PROFILE.SUB zu ändern. :lol:
Aber davon einmal abgesehen läuft's gut... :)
Bildschirmfoto_2023-02-18_11-40-54.png
Bildschirmfoto_2023-02-18_11-40-54.png (20.17 KiB) 2118 mal betrachtet
Was mit der ersten Stelle hinterm Komma los ist, verstehe ich noch nicht ganz, aber schon interessant. :shock:
Ä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... :mrgreen:

Bildschirmfoto_2023-02-18_11-55-47.png
Bildschirmfoto_2023-02-18_11-55-47.png (18.57 KiB) 2116 mal betrachtet
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Ja, die eckigen und geschweiften Klammern sehen mit den deutschen Tastatureinstellungen auf der Joyce "ungewohnt" aus... :D
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:

einaus.png
einaus.png (7.19 KiB) 2111 mal betrachtet
Paul
Beiträge: 137
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

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" 8-)
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Hallo Paul,

danke für's Feedback. Das hält mich motiviert weiterzumachen. :)
Paul
Beiträge: 137
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

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.
kurt
Beiträge: 163
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

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 :D , 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 :lol:
kurt
Beiträge: 163
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Moin Bernd,
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.
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.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

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

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;
}
wird jeweils folgender Assembler-Code:

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
zsdcc:

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
Antworten