Falsche Hex Zahl und Fehler-Meldung
-
Hallo liebe Community,
jetzt nicht lachen, ich bin blutiger Programmier- und C-Anfänger.
Ich habe folgende Probleme:
- Warum zeigt er mir bei folgenden Quellcodes die Hexadezimale Zahl immer als "22ff70" an?
# include <stdio.h> main() { int z1,z2; scanf("%d%d",&z1,&z2); printf("\n%d\n%x",z1+z2); }
# include <stdio.h> main () { int z1,z2; scanf("%d\n%d",&z1,&z2); printf("%d\n%x",z1-z2); }
# include <stdio.h> main() { int z1,z2; scanf("%d%d",&z1,&z2); printf("\n%d\n%x",-(z1+z2)); }
- Bei der Ausführung folgenden Programms stürzt es ab mit folgender Fehlermeldung:
a.exe - Fehler in Anwendung
Die Anweisung in "0x77c14995" verweist auf Speicher in "0x004013a0". Der Vorgang "written" konnte nicht...# include <stdio.h> main () { int z1,z2,z3,rest; printf("Bitte geben sie die beiden Zahlen ein, die dividiert und deren Rest ermittelt werden soll!"); scanf("%d%d",z1,z2); printf("\nDie Zahlen %d und %d liefert %d und den Rest %ld",z1,z2,z1/z2,z1-(z3/z2)); }
Ich benutze gcc als Compiler
Besten Dank! :xmas1:
-
zu 1: Du mußt für jeden Formatkenner (%...) im Formatstring einen eigenen Parameter (auszugebender Wert) übergeben - in deinen Beispielen hast du 2 Formatkenner ("\n**%d**\n**%x**"), aber nur einen Parameter, also schreibt er als zweiten Wert das, was zufälligerweise als nächstes im Stack steht.
zu 2: Für scanf() mußt du die Adressen der Zielvariablen übergeben (Stichwort "call-by-reference"):
scanf("%d%d",&z1,&z2);
(PS: Den Divisionsrest kannst du auch einfacher haben als z1%z2)
-
CStoll schrieb:
...mußt du die Adressen der Zielvariablen übergeben (Stichwort "call-by-reference")...
lass das bloss nicht Tim lesen.
-
hast recht, aber... schrieb:
lass das bloss nicht Tim lesen.
Ja, ich weiß, was er davon hält - aber er sollte mich lange genug kennen, um die Aussage zu verstehen.
(und das Thema kommt auch zu oft, als daß ich jedes Mal dazuschreiben will "Ja, C hat keine Referenzen, aber über Zeiger kann man das nachbilden, was andere Sprachen als call-by-reference bezeichnen")
-
CStoll schrieb:
zu 1: Du mußt für jeden Formatkenner (%...) im Formatstring einen eigenen Parameter (auszugebender Wert) übergeben - in deinen Beispielen hast du 2 Formatkenner ("\n**%d**\n**%x**"), aber nur einen Parameter, also schreibt er als zweiten Wert das, was zufälligerweise als nächstes im Stack steht.
zu 2: Für scanf() mußt du die Adressen der Zielvariablen übergeben (Stichwort "call-by-reference"):
scanf("%d%d",&z1,&z2);
(PS: Den Divisionsrest kannst du auch einfacher haben als z1%z2)
Ach Mensch, dass sind aber auch teilweise dumme Fehler.
Und vielen Dank für den Rest-Tipp.