Mal sehen, wie sich ein eher unterdurchschnittlicher Basicprogrammierer hier schlaegt
![Lächeln :)](./images/smilies/icon_e_smile.gif)
Danke auf jeden Fall an Bernd, der sich richtig viel Muehe gibt!
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
Code: Alles auswählen
../_DEVELOPMENT/l/sccz80/9-common/f48/fa.asm:12: error: undefined symbol: init_floatpack
^---- init_floatpack
Du hast die Mathematik-Library nicht eingebunden. Ändere deinen Compiler-Aufruf in:
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.
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.
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.