Würde mich gern mal mit C befassen

Es gibt 196 Antworten in diesem Thema, welches 21.161 mal aufgerufen wurde. Der letzte Beitrag (24. Mai 2023 um 15:33) ist von Axellander.

  • Ich fand das Buch "Einstieg in C" von Thorsten Theis ganz gut. Das Buch gibt eine gute Einführung und streift auch noch fortgeschrittene Themen wie Datenbankzugriff und grafische Benutzeroberflächen.

  • Danke erstmal an alle. Da sind viele Infos und links dabei.

    Ich denke, dass ich mich erstmal mit den Grundlagen vom Amiga vertraut machen werde (hatte schon vor ca. 3 Jahren bisschen was gemacht, aber vieles ist schon wieder vergessen - tja das Alter...)

    Parallel dazu wollte ich mich dann mit C beschäftigen, auch am Amiga.

    Übrigens: Die geschweiften Klammern bekommt man mit Alt + Shift + (ü oder +).

  • Übrigens: Die geschweiften Klammern bekommt man mit Alt + Shift + (ü oder +).

    Eventuell macht es da Sinn die Tastatur auf US umzustellen. Dann sind die Klammern leichter zu tippen.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • bitte nicht hauen, aber wäre es nicht einfacher, die Gehversuche auf nem Free- oder Netbsd zu machen ? Das läuft auch in einer VM.

    Odin, far og klokeste av alle guder, gi meg veiledning, visdom og seier i mine anstrengelser

  • bitte nicht hauen, aber wäre es nicht einfacher, die Gehversuche auf nem Free- oder Netbsd zu machen ? Das läuft auch in einer VM.

    Noch einfacher ist das hier: Bitte melde dich an, um diesen Link zu sehen.

    Aber das macht halt weniger Spaß, wenn man den Amiga mag. :)

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • ja, aber näher am standard geht nicht.

    Diese Standard-Kiste spielt doch eigentlich auch gar keine Rolle, wenn man erste Gehversuche macht. :)

    Das wird eigentlich auch erst wichtig, wenn es um Portabilität geht, und bis man soweit ist, stolpert man über viele Problemchen, aus denen man lernt.

  • ich glaub, da haben wir uns missverstanden.

    C kommt mehr oder weniger aus der Unix-Welt. Ich fánde es am sinnvollsten, mit nem Kommandozeilensystem ohne Schnickschnack zu starten. Idealerweise.mit nem alten 4er BSD, weil da keine besonderen Libraries zum tragen kommen und alles tatsäxhlich der ursprünglichen reinen Lehre entspricht. Darauf kann man dann aufbauen.

    Odin, far og klokeste av alle guder, gi meg veiledning, visdom og seier i mine anstrengelser

  • Idealerweise.mit nem alten 4er BSD

    Funktionsvereinbarungen der uralten K&R-Syntax sollten keinem Einsteiger empfohlen werden, weil da überhaupt keine Typprüfung stattfindet:

    Code
    main(argc, argv)
    int argc; char **argv;

    Also Finger weg davon, trotz Retroliebe.

  • Wollte mal kurz Rückmeldung zu meinen C-Versuchen geben:

    Ich hab mal den HiSoft C++-Compiler installiert - der ist vom Editor her schon sehr komfortabel.

    Zudem arbeite ich gerade das Tutorial Bitte melde dich an, um diesen Link zu sehen. durch:

    Wie siehts hiermit aus?: Bitte melde dich an, um diesen Link zu sehen.

    Momentan bin ich bei dem Beispiel mit den Verzeigungen:

    Im Online C-Compiler (Hier z.B.: Bitte melde dich an, um diesen Link zu sehen.) funktionieren alle 3 Fälle, am Amiga mit HiSoft C++ nur der 2. und der 3. Fall.

    Im Debugger stehen auch jeweils die richtigen Werte in den Variablen. Trotzdem will's im ersten Fall nicht klappen.

    Ich habe dann auch mal "einwurf" und "preis" mit 10 multipliziert und nach int gecastet, um diese Werte zu vergleichen:

    Code
    int a, b;
    
    a = (int)(einwurf*10);
    b = (int)(preis*10);

    Seltsamerweise steht dann in a=4 und in b=5 drin. Ich frage mich, wie das sein kann ???

  • Seltsamerweise steht dann in a=4 und in b=5 drin. Ich frage mich, wie das sein kann ???

    Das ist schon eigenartig und klingt irgendwie nach Bug im Compiler/der C-Runtime, speziell bei scanf in ein float.

    Was passiert, wenn Du testweise alles auf int mit z.B. den Fällen 50, 100 und 200 Cents umbaust?

    Floats sollte man so gut wie nie auf Gleichheit überprüfen.

    Durch kleine Abweichungen nach Operationen kann z.B. 0,999999 mit 1 verglichen werden, obwohl ersterer Wert auf dem Papier 1 ergibt.

    Üblich ist ein Vergleich mit einem Intervall, z.B. "if ((a >= 0.999) && (a < 1.001))", wobei der Epsilon-Wert (hier 0,001) sinnvoll gewählt werden sollte.

  • Jup. Bei Geldbeträgen würde ich außerhalb von Börsenpapieren und Zinsen auch immer in Integern (Cents) rechnen. Floats würde ich erst anfassen wenn wirklich nötig.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Dass man Floats nicht miteinander vergleicht hatte ich auch noch so im Kopf. Deswegen hat mich das auch gewundert, dass sowas im Tutorial gemacht wird.

    Mit int funktioniert alles.

    Aber dass die Werte a und b nach dem type casting im oberen Bsp. unterschiedlich sind, verstehe ich nicht.

  • Der Cast auf int schneidet ja nur Nachkommastellen weg. Dann war ein Float-Wert vorher 0.4999999 und der andere 0.5000001 oder so was.

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Der Cast auf int schneidet ja nur Nachkommastellen weg. Dann war ein Float-Wert vorher 0.4999999 und der andere 0.5000001 oder so was.

    Wäre trotzdem kurios, wenn scanf() bei Eingabe von "0.5" einmal 0,499... und das andere Mal im selben Programm 0,500..1 einliest. =)

    (Zumal 0.5 ja exakt in float abgebildet werden kann.)

  • preis = 0.5; ist aber kein float, sondern ein double. Evtl. geht da beim impliziten downcast was flöten?

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Im Online C-Compiler (Hier z.B.: Bitte melde dich an, um diesen Link zu sehen.) funktionieren alle 3 Fälle, am Amiga mit HiSoft C++ nur der 2. und der 3. Fall.

    Im Debugger stehen auch jeweils die richtigen Werte in den Variablen. Trotzdem will's im ersten Fall nicht klappen.

    Ich habe dann auch mal "einwurf" und "preis" mit 10 multipliziert und nach int gecastet, um diese Werte zu vergleichen:

    Seltsamerweise steht dann in a=4 und in b=5 drin. Ich frage mich, wie das sein kann ???

    Ich kenn den HisoftC nicht, daher nur eine Vermutung. Früher war ein wesentlicher Unterschied zwischen AztecC und LatticeC dass Aztec standardmäßig 16 Bit Interger verwendet hat, während Lattice immer 32 Bit Werte benutzt hat. Das bedeutet dass Programme, die auf beiden korrekt kompilieren, trotzdem fehlerhaft laufen und auch abstürzen können. Speziell wenn man printf("%d") benutzt kommt das dann zum tragen (genauso natürlich wie bei scanf). Bei scanf noch schlimmer, weil dann Speicher/Stack überschrieben wird, bei printf bekommt man im eventuell Fall nur falsche Werte ausgegeben.

    Möglicherweise ist das auch hier das Problem. Ich lkönnte mir vorstellen dass der Onlinecompiler 32Bit verwendet. Versuch mal auf beiden ein

    Code
    printf("%d\n", sizeof(int));

    und schau ob die beiden die gleichen Werte ausgeben.

    Ich habe immer den AztecC bevorzugt, eben weil der 16Bit benutzt hatte und ich da noch auf jedes Byte geschaut habe. :)

  • Jup. Bei Geldbeträgen würde ich außerhalb von Börsenpapieren und Zinsen auch immer in Integern (Cents) rechnen. Floats würde ich erst anfassen wenn wirklich nötig.

    Wenn ich ernsthaft mit Geldbeträgen rechnen würde (im Sinne einer Bankanwendung), dann würde ich weder int noch float verwenden, sondern BCD, bzw. eine Library die speziell dafür gemacht ist um den Fehlern zu entgehen die durch die Binärdarstellung im Speicher entstehen.

  • Ich habe bei sasc in "Code Options" mal statt "NoMath" "Math=Standard" eingegeben. Damit funktioniert's in sasc.

    printf("%d\n", sizeof(int)); liefert in sascc, HiSoft und dem Online Compiler 4.