Fragen und Antworten zum C-Kurs

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
schombi
Beiträge: 127
Registriert: 09.02.2015, 19:19

Re: Fragen und Antworten zum C-Kurs

Beitrag von schombi »

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!
My beloved residents:
http://schombi.de/my-retro-collection.html
kurt
Beiträge: 194
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Toll, das Du mit machst. Ich hoffe, Du kannst aufschließen, bevor Bernd weiter macht.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

schombi hat geschrieben: 17.03.2023, 06:46 ...
Mal sehen, wie sich ein eher unterdurchschnittlicher Basicprogrammierer hier schlaegt :)
...
Das wird schon. Scheue dich nicht Fragen zu stellen, wenn du irgendwo nicht weiter kommst. Die Hauptsache ist, dass man am Ball bleibt. :)
Paul
Beiträge: 147
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Wie gesagt, ich bin dabei die Übungen nachzuholen.
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
und noch ganz viele Zeilen mehr.
Was mache ich falsch?
Paul
Beiträge: 147
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

enum.c mit den Planeten lässt sich auch nicht von mir übersetzen.
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
Paul
Beiträge: 147
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

Es ist nicht so das ich gar nichts übersetzen kann.
Die vier Stringbeispiele habe ich übersetzt bekommen.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Paul hat geschrieben: 18.03.2023, 17:41...
Was mache ich falsch?
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.
Paul
Beiträge: 147
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Fragen und Antworten zum C-Kurs

Beitrag von Paul »

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 :geek:
Egal, ich bin wieder up to date ;)
kurt
Beiträge: 194
Registriert: 26.10.2019, 20:11

Re: Fragen und Antworten zum C-Kurs

Beitrag von kurt »

Auch das ich etwas vom linken explizit weglassen muss (Dateioperationen) verwirrt.
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 ?
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Re: Fragen und Antworten zum C-Kurs

Beitrag von bbock »

Paul hat geschrieben: 19.03.2023, 08:43 ... Ich dachte wenn ich etwas "neues" hinzu nehmen möchte füge ich das mit einem include hinzu.
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.
Paul hat geschrieben: 19.03.2023, 08:43 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.
...
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. :roll:
Den Optimizer betreffend können wir froh sein, dass es überhaupt einen gibt. Und ja: du bist verwöhnt! :P
Antworten