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.
Würde mich gern mal mit C befassen
-
Ingo -
16. Februar 2023 um 09:08 -
Erledigt
Es gibt 196 Antworten in diesem Thema, welches 21.161 mal aufgerufen wurde. Der letzte Beitrag (
-
-
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.
-
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.
-
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.

-
ja, aber näher am standard geht nicht.
-
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.
-
Idealerweise.mit nem alten 4er BSD
Funktionsvereinbarungen der uralten K&R-Syntax sollten keinem Einsteiger empfohlen werden, weil da überhaupt keine Typprüfung stattfindet:
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:
Code
Alles anzeigen/* Getraenke Automat Version 0.2 */ printf("Getraenke Automat v0.2\n\n"); // Auswahl der Getraenke int sorte; printf("Waehlen sie ihr Getraenk aus:\n"); printf("1) Wasser (0,50 Euro)\n"); printf("2) Limonade (1,00 Euro)\n"); printf("3) Bier (2,00 Euro)\n\n"); printf("Geben sie 1, 2 oder 3 ein: "); scanf("%d", &sorte); // lege den zu zahlenden Betrag fest float preis=0; switch(sorte) { case 1: preis = 0.5; break; case 2: preis = 1.0; break; case 3: preis = 2.0; break; } // Aufforderung zur Bezahlung float einwurf=0; printf("\nBitte werfen sie %.2f Euro ein: ", preis); scanf("%f", &einwurf); // ueberpruefe Geldstueck if(einwurf == preis) { printf("\nVielen Dank, bitte entnehmen sie ihr Getraenk.\n"); }else { printf("\nSie haben kein %.2f Euro Stueck eingeworfen.\n", preis); }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 ???
-
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.
-
Alles anzeigen
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 testweisealles 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.
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.
-
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?
-
Ich habe das ganze mal mit sasc ausprobiert. Mit int funktioniert's. Mit float-Werten bekomme ich beim Compilieren eine Fehlermeldung.
-
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
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.
-