Seltsame Warnung



  • /home/mint/Schreibtisch/math/main.c|23|warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]|

    /home/mint/Schreibtisch/math/main.c|28|warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]|

    ||=== Build finished: 0 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|

    Ich weiß irgendwie nicht, was mir der Compiler damit sagen will:
    "Du sollst der Variable den Datentyp "int" geben, sie hat aber den Datentyp "int"", hä?

    Mein Programm ist eigentlich aus einer Lektion aus einer C-Lektüre, wieso will das nicht?



  • Tomete schrieb:

    /home/mint/Schreibtisch/math/main.c|23|warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]|

    "Du sollst der Variable den Datentyp "int" geben, sie hat aber den Datentyp "int"", hä?

    Es wird ein int erwartet, du übergibst aber eine int * (also einen Zeiger auf int )... etwas Quellcode wäre hilfreich... speziell der Bereich um Zeile 23 und 28...



  • Um es zu erklären:
    Das ist ein Programm aus "C für Dummies", wo man den zu zahlenden Betrag bei der Restaurierung bei Monopoly berechnet, ich wollte allerdings testen, dass man es quasi für nur eine Straße macht, also nur 1 Hotel und 4 Häuser möglich.
    (Also die Bedingung ist von mir, der Rest aus der Lektüre)

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
    
    int haeuser;
    char hotel;
    int total;
    
    printf("Anzahl der Haeuser");
    scanf("%d", &haeuser);
    
    printf("Hast du ein Hotel?");
    scanf("%s", &hotel);
    
    if
    (hotel=='j' && haeuser<5)
    {
    total = (haeuser * 40)+115;
    printf("Das kostet dann %i DM", total);
    }
    
    if(hotel=='n' && haeuser<5)
    {
    total = haeuser * 40;
    printf("Das kostet dann %i DM", total);
    }
    
    else
    printf("Das kann so nicht stimmen");
    }
    


  • Und was für Fehler/Warnungen werden jetzt für diesen Quelltext ausgegeben?

    Außerdem: Schau mal, was scanf("%s", &hotel); genau macht und wieviele Zeichen in hotel passen. Und in Zeile 25 möchtest du wahrscheinlich ein else if benutzen...



  • lagalopex schrieb:

    Außerdem: Schau mal, was scanf("%s", &hotel); genau macht und wieviele Zeichen in hotel passen.

    Mit ein bisschen Glück kann Tomete die Auswirkungen seines ersten Pufferüberlaufs auch gleich selber sehen:

    #include <stdio.h>
    
    int main(void)
    {
      int haeuser;
      char hotel;
      int total;
    
      printf("Anzahl der Haeuser? ");
      scanf("%d", &haeuser);
    
      printf("Hast du ein Hotel? ");
      scanf("%s", &hotel);
    
      printf("haeuser: %d\n", haeuser);
    }
    


  • Fehlermeldungen so gesehen keine, aber die oben stehenden Warnungen. Nur kommt immer 115 raus, wenn ich das Programm ausführe.
    Wenn ich die Eingabe der Häuser ausgeben lasse also mit

    printf("%i", haeuser);
    

    dann gibt er auch aus, was ich eingegeben habe.
    Das Problem wird er bei der Berechnung haben.



  • "Er" hat keine Probleme, du hast die Probleme.

    Außerdem: Schau mal, was scanf("%s", &hotel); genau macht und wieviele Zeichen in hotel passen.

    Das hast du definitiv nicht gemacht, sei nicht so faul.



  • "Er" hat keine Probleme, du hast die Probleme.

    Zitat:
    Außerdem: Schau mal, was scanf("%s", &hotel); genau macht und wieviele Zeichen in hotel passen.

    Das hast du definitiv nicht gemacht, sei nicht so faul.

    Am Besten gar nicht erst auf die Freundlichkeit eingehen, bringt leider sowieso nix.



  • Also da es sich bei Hotel um einen int handelt, sollte der Wertebereich doch –2147483648 +2147483647 sein, oder nicht?



  • Tomete schrieb:

    Also da es sich bei Hotel um einen int handelt

    Häh?
    Ich sehe da:
    ...
    char hotel;
    ...



  • Ups, tut mir leid. Habe falsch geguckt. Aber ist char nicht immer ein Zeichen lang, es sei denn man schreibt [n] dahinter?



  • Nein, char ist die kleinste adressierbare Einheit einer Architektur. Können 8 Bit sein oder auch 16.
    Edit: Oder so. Alles andere ist compilerspezifisch, wie z.B. Bitfields gehandhabt werden.



  • OK, aber wie lese ich dann "hotel" aus? Wenn ich printf("%s", hotel) als Befehl angebe gibt er es nicht aus.



  • Bei %s erwartet printf einen Zeiger auf ein Nullterminiertes Char-Array.
    Das wird i.A. C-String genannt.

    scanf erwarte bei %s einen Adresse, wo es so einen C-String ablegen kann. An der Adresse muss genug Platz dafür vorhanden sein.

    Ein einzelnes char ist dafür nicht ausreichend.

    Zum Einlesen eines einzelnen Zeichens gibt es %c als Formatspecifier bei scanf .
    Damit du mit übriggebliebenen Whitespace keine Problem bekommst, mach noch ein Leerzeichen davor:

    scanf(" %c", &hotel);
    prinft("Zeichen:%c", hotel);
    

    Glaub jetzt aber nicht, dass die Bedeutung der Formatspecifier bei scanf und printf gleich sind. Das sind sie nicht.



  • Hm, wenn ich bei "scannf" %c statt %s verwende, darf ich gar nichts mehr eingeben. Und das Hotel berechnet er ja auch immer. Nur egal, was ich für die Häuser eingebe, es kommt immer 115 raus.



  • Dann zeig deinen aktuellen Code, sonst raten wir nur rum.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
    
    int haeuser;
    char hotel;
    int total;
    
    printf("Anzahl der Haeuser");
    scanf("%i", &haeuser);
    printf("%i", haeuser);
    printf("Hast du ein Hotel?");
    scanf("%c", &hotel);
    
    if
    (hotel=='j' && haeuser<5)
    {
    total = (haeuser * 40)+115;
    printf("Das kostet dann %i DM", total);
    printf("%c", hotel);
    }
    if(hotel=='n' && haeuser<5)
    {
    total = haeuser * 40;
    printf("Das kostet dann %i DM", total);
    }
    
    else
    {
    printf("Das kann so nicht stimmen");
    }
    return 0;
    }
    


  • DirkB schrieb:

    Damit du mit übriggebliebenen Whitespace keine Problem bekommst, mach noch ein Leerzeichen davor:

    scanf(" %c", &hotel);
    prinft("Zeichen:%c", hotel);
    

    Nochmal: zwischen " und %c soll ein Leerzeichen



  • Ah, vielen Dank, jetzt geht es. Manchmal sind es halt wirklich die Kleinigkeiten...


Log in to reply