Fragen und Antworten zum C-Kurs
Re: Fragen und Antworten zum C-Kurs
Auf Bernds Anraten in Helmarshausen habe ich nun auch mit dem Kurs angefangen. Immerhin, das Laptop wurde soweit schon vorbereitet und ich habe schon aus hello.c schon eine hello.com machen koennen.
Mal sehen, wie sich ein eher unterdurchschnittlicher Basicprogrammierer hier schlaegt
Danke auf jeden Fall an Bernd, der sich richtig viel Muehe gibt!
Mal sehen, wie sich ein eher unterdurchschnittlicher Basicprogrammierer hier schlaegt
Danke auf jeden Fall an Bernd, der sich richtig viel Muehe gibt!
My beloved residents:
http://schombi.de/my-retro-collection.html
http://schombi.de/my-retro-collection.html
Re: Fragen und Antworten zum C-Kurs
Toll, das Du mit machst. Ich hoffe, Du kannst aufschließen, bevor Bernd weiter macht.
Re: Fragen und Antworten zum C-Kurs
Wie gesagt, ich bin dabei die Übungen nachzuholen.
Ich habe versucht den Taschenrechner aus den Stringfolgen zu übersetzen.
ohne Erfolg.
und noch ganz viele Zeilen mehr.
Was mache ich falsch?
Ich habe versucht den Taschenrechner aus den Stringfolgen zu übersetzen.
ohne Erfolg.
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
/* Formats a float by cutting off the zeroes at the end.
If there are only zeroes after the decimal point, then
the decimal point is cut off, too.
Parameters: f the float value to format
formatted a character buffer to hold the float as string
*/
void formatNumber(float f, char *formatted) {
char *s;
sprintf(formatted, "%f", f);
s = formatted + strlen(formatted);
--s;
while (s != formatted) {
if (*s != '0') {
if (*s != '.') {
++s;
}
*s = '\0';
break;
}
--s;
}
}
/* Main.
Returns an error code (== 0: ok, != 0: error).
*/
int main(void)
{
float fInput, fAkku;
char op, currentOp;
char continueLoop;
char formatted[20];
printf("Mini-Taschenrechner\n\n");
op = '\0';
fAkku = 0;
continueLoop = 1;
do {
printf("Zahl : ");
scanf("%f", &fInput);
printf("Operation: ");
currentOp = getchar();
currentOp = getchar();
switch (op) {
case '\0':
fAkku = fInput;
break;
case '+':
fAkku = fAkku + fInput;
break;
case '-':
fAkku = fAkku - fInput;
break;
case '*':
fAkku = fAkku * fInput;
break;
case '/':
fAkku = fAkku / fInput;
break;
default:
continueLoop = 0;
}
formatNumber(fAkku, formatted);
printf(" %s\n", formatted);
op = currentOp;
} while (currentOp != '=' && continueLoop);
return 0;
}
Code: Alles auswählen
zcc +cpm -subtype=pcw80 -create-app calc.c -o calc.com
calc.c::main::0::5:36: error: undefined symbol: dadd
^---- dadd
calc.c::main::0::5:36: error: undefined symbol: dsub
^---- dsub
calc.c::main::0::5:36: error: undefined symbol: dmul
^---- dmul
calc.c::main::0::5:36: error: undefined symbol: ddiv
^---- ddiv
Was mache ich falsch?
Re: Fragen und Antworten zum C-Kurs
enum.c mit den Planeten lässt sich auch nicht von mir übersetzen.
Das erzählt mir was von
Das erzählt mir was von
Code: Alles auswählen
../_DEVELOPMENT/l/sccz80/9-common/f48/fa.asm:12: error: undefined symbol: init_floatpack
^---- init_floatpack
Re: Fragen und Antworten zum C-Kurs
Es ist nicht so das ich gar nichts übersetzen kann.
Die vier Stringbeispiele habe ich übersetzt bekommen.
Die vier Stringbeispiele habe ich übersetzt bekommen.
Re: Fragen und Antworten zum C-Kurs
Du hast die Mathematik-Library nicht eingebunden. Ändere deinen Compiler-Aufruf in:
zcc +cpm -subtype=pcw80 -lm -create-app calc.c -o calc.com
Damit sollte es funktionieren. Beschrieben ist das in Kapitel 5. Vielleicht sollte ich bei jedem Beispiel den zcc-Aufruf angeben, damit es keine Missverständnisse gibt. Zu den zcc-Parametern hatte ich sowieso noch einen Artikel geplant. Die Parameter sind nicht wirklich intuitiv, und manchmal auch etwas merkwürdig. Z.B. braucht man bei der Joyce (Platform PCW) die Option -create-app, wenn man etwas mit Grafik machen möchte, wodurch man auch ein Disketten-Image erstellt, welches man aber gar nicht unbedingt benötigt. Bei anderen Plattformen braucht man das nicht...
Das floatpack ist ebenfalls in der Mathe-Lib enthalten; ändere deinen zcc-Aufruf entsprechend.
Re: Fragen und Antworten zum C-Kurs
Super, vielen Dank Bernd.
Das funktioniert jetzt natürlich.
Ich bin allerdings etwas verwirrt. Ich dachte wenn ich etwas "neues" hinzu nehmen möchte füge ich das mit einem include hinzu.
Auch das ich etwas vom linken explizit weglassen muss (Dateioperationen) verwirrt.
Vielleicht bin ich da etwas zu verwöhnt, ich kenne das eigentlich so das der Optimizer das selber erkennt.
zcc ist ja kein Uraltprogramm sondern eins das auf 64bit Windows läuft
Egal, ich bin wieder up to date
Das funktioniert jetzt natürlich.
Ich bin allerdings etwas verwirrt. Ich dachte wenn ich etwas "neues" hinzu nehmen möchte füge ich das mit einem include hinzu.
Auch das ich etwas vom linken explizit weglassen muss (Dateioperationen) verwirrt.
Vielleicht bin ich da etwas zu verwöhnt, ich kenne das eigentlich so das der Optimizer das selber erkennt.
zcc ist ja kein Uraltprogramm sondern eins das auf 64bit Windows läuft
Egal, ich bin wieder up to date
Re: Fragen und Antworten zum C-Kurs
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.Auch das ich etwas vom linken explizit weglassen muss (Dateioperationen) verwirrt.
Ist dazu etwas bekannt ?
Re: Fragen und Antworten zum C-Kurs
Das include fügt eine Header-Datei (*.h) in den Source Code ein. Damit werden Typen, Variablen und Funktionen deklariert. Das heißt, deren Namen werden bekannt gemacht. Zu den Namen braucht man aber auch noch den dazugehörigen Programmcode. Der kommt aus einer .c-Datei oder - bereits vorkompiliert - aus einer library.
Nehmen wir mal an, du hast per include "xyz.h" eine Funktion namens mySpecialFunction in deinem C-Programm verfügbar gemacht. Dann brauchst du zusätzlich entweder die xyz.c in deiner zcc-Source-Code-Liste oder du musst mit dem Linker eine library einbinden, die die Funktion mySpecialFunction enthält. Das geschieht im zcc-Aufruf über eine -l Option. zcc wird immer als Compiler-Frontend bezeichnet, aber eigentlich ruft zcc sowohl den C-Compiler als auch den Linker auf.
Das mit dem Weglassen ist in der Tat etwas gewöhnungsbedürftig. Die Dateioperationen sind eben standardmäßig mit dabei. Die Option -lndos ist schon ein gewisser Logik-Bruch; hier wird keine Library dazugebunden, sondern etwas von einer Standard-Library weggelassen.
Den Optimizer betreffend können wir froh sein, dass es überhaupt einen gibt. Und ja: du bist verwöhnt!