&int richtig casten aber wie?



  • hallo

    ich habe hier einen funktionsaufruf

    void Funktion(int *zahl){}
    

    dann hab ich hier

    short zahl2;
    

    wie caste ich richtig?

    Funktion(&zahl2){}
    

    ich bekomme da diese Fehlermeldung:
    "warning C4133: 'function' : Inkompatible Typen - von 'short *' zu 'int *'"
    müsste doch durch caten wegzubekommen sein?



  • Klar könntest du das casten - Funktion((int*)&zahl2); , aber mit etwas Pech landest du damit in Teufels Küche (Access Violation und Co.). Besser ist es, du nimmst gleich kompatible Datentypen (wenn eine Funktion inen int erwartet, kann sie mit einem short nicht viel anfangen).



  • Das ist undefiniert, da sizeof(short) < sizeof(int) sein kann. Spätestens wenn die Funktion dann schreibend auf die Speicherstelle zugreift, krachts eh.

    Ansonsten: Die Compilermeldung bekommt man in der Tat durch einen gänzlich normalen Cast weg. Nützt aber auch nix 😉



  • Da die Zahl die in die Speicherstelle Zahl2 geschrieben wird immer < 512 ist, hab ich gedacht es macht nix das so zu machen wie ich es geschrieben habe, wäre die Zahl größer hätte ich es nicht so gemacht, im Endeffekt mit diesen beschriebenen Vorgaben läuft das Programm dann oder hab ich immer noch irgendwo ein Problem das mir nachträglich eins auswischen könnte. Aber wenn es nur darum geht, zu sagen man weis ja nie wie das Proggy mal erweitert wird, vieleicht wird die Zahl ja mal größer, ist dazu zu sagen: das trifft nicht zu.



  • Selbst wenn du nur eine 1 dort reinschreibst, erwartet das Programm dort trotzdem genug Platz für einen kompletten int-Wert (typisch 4 Byte). Der short, den du übergibst, hat aber nur Platz für (typisch) 2 Byte, also arbeitet das Programm mit dem Speicher der Variablen, die das Pech hat, direkt hinter deinem short-Wert auf dem Stack zu stehen (mit Glück wird der Bereich nicht gebraucht, aber in extremen Fällen steht dort die Rücksprungadresse deiner Funktion - und dann landest du sonstwo).



  • Ah ok vielen Dank. Jetzt hab ich es verstanden. Da ich aber die Variable Zahl2 an diversen anderen Stellen im Programm benötige und sie nur hier in dieser Form benötigt wird, soll ich dann besser das so schreiben:

    int  help;
    
    Funktion(&help){}
    zahl2 = (short)help;
    

    wäre das dann unbedenklich?



  • Ja, das ist unbedenklich - die Funktion bekommt genug Platz für ihre Daten und bei der Typumwandlung werden überschüssige Null-Bytes gefahrlos abgeschnitten (selbst wenn du irgenwann den Wertebereich von short überschreitest, bekommst du "nur" falsche Werte).


Anmelden zum Antworten