Falsche Hex Zahl und Fehler-Meldung



  • Hallo liebe Community,

    jetzt nicht lachen, ich bin blutiger Programmier- und C-Anfänger.

    Ich habe folgende Probleme:

    1. 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));
    }
    
    1. 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.


Anmelden zum Antworten