Frage zu int und float !!



  • Hallo Leute,

    Ich habe da so ein kleines Problem !!
    Ich habe ein Atribut vom Typ float. Jetzt möchte ich das die ´zahl vor dem komma in ein int übertragen wird !! Wenn ich es aber so mache.

    int x=0;
    float y=0;
    
    y= 87,58;
    
    x = y;
    

    Dann bekomme ich immer eine Warnung vom Compiler !!

    Wie kann ich das Problem lösen ??? Wichtig ist für mich die Zahl vor dem Komma!!

    Danke Coolsero



  • Du schreibst nicht, wie die Warnung lautet, aber ich nehme an, dass der Compiler dich vor dem Datenverlust warnt, der passiert, wenn du float in int konvertierst. Das ist aber genau das, was du willst. Du kannst dem Compiler (und dem Leser des Codes) aber auch zeigen, dass diese Umwandlung beabsichtigt ist:

    x = static_cast<int>(y);
    


  • x = static_cast<int>(y);
    


  • fubar schrieb:

    x = static_cast<int>(y);
    

    lieber

    x=int(y);
    

    und die magischen worte wie static_cast aufheben für magische verwendungszwecke.



  • volkard schrieb:

    und die magischen worte wie static_cast aufheben für magische verwendungszwecke.

    Was meinste denn damit? 😉



  • Till schrieb:

    volkard schrieb:

    und die magischen worte wie static_cast aufheben für magische verwendungszwecke.

    Was meinste denn damit? 😉

    static_cast nehmen, wo man aufpassen muss. die langen _cast-wörte sind ja extra so lang, damit man sie ungern nimmt und damit sie als gefahrenkennzeichen leuchten. also bei downcasts in einer klassenhierarchie das zauberwort static_cast setzen. aber nicht, wenn man bloß dm compiler bescheid sagt, daß man um die rundungsfehler weiß und keine warnung da hören mag.



  • Hier kann man rumdiskutieren, so lang man will, aber wenn er einen Beistrich statt einem Komma schreibt, wird wohl nie das rauskommen, was gemeint ist.



  • Ich benutze aus gewohnheit immer das lange static_cast.
    IMHO ist das auch etwas aussagekräftiger, denn wenn man zum Beispiel Zeiger casten will dann kann man das mit einem expliziten reinterpret_cast machen, dann sieht man es auch gleich. Für 'nen Standard-cast dann halt static_cast.



  • randa schrieb:

    Ich benutze aus gewohnheit immer das lange static_cast.
    IMHO ist das auch etwas aussagekräftiger, denn wenn man zum Beispiel Zeiger casten will dann kann man das mit einem expliziten reinterpret_cast machen, dann sieht man es auch gleich. Für 'nen Standard-cast dann halt static_cast.

    Aussagekraeftiger? Warum? Was ist an einem

    char* p = reinterpret_cast<char*>(some_pointer);
    

    aussagekraeftiger als bei einem

    char* p = (char*)some_pointer;
    

    ? Warum sollte man hier nicht gleich sehen, was gemeint ist?

    mfg
    v R



  • Ansichtssache. Ich sehe bei einem reinterpret_cast sofort, das es sich um einen expliziten Zeigercast handelt.
    Über solche sachen kann man schlecht diskutieren.
    Ich mache es halt so.



  • Ich muss sagen, ich finde

    char *p = reinterpret_cast<char*>(zeiger) + index;
    

    leichter verständlich als

    char *p = (char*) zeiger + index;
    

    Man sieht halt sofort, was genau gecastet wird.



  • Bin ich blind, oder warum sehe ich auf den ersten Blick trozdem das gleiche?

    mfg
    v R



  • Ist doch scheißegal. Eine Sache der Gewohnheit.



  • randa schrieb:

    Ist doch scheißegal. Eine Sache der Gewohnheit.

    Ok, trotzdem kein Grund, ausfallend zu werden, oder? (rhetorische Frage)

    mfg
    v R



  • Ich fand C-style casts zu Anfang verwirrend, weil ich mir nicht sicher war, ob (char*) p + i das selbe wie ((char*) p) + i oder (char*) (p + i) war. OK, inzwischen seh ich das auch auf den ersten Blick, aber bei c++-style casts ist es für meinen Geschmack offensichtlicher.



  • Ich schätze mal, das kommt drauf an, was man gelernt hat: ich habe ein C++-Buch, da wird nur mit "static_cast" gecastet, egal ob bei Rundungen oder sonstigem (Na gut, 🙄 "reinterpret_cast" natürlich auch, aber keine C-Casts!). Wenn nun jemand so C++ lernt, wird er auch so casten bzw. so gewöhnt sein, wobei die C'ler bei ihrem Cast bleiben (was ja schreibfauler :p ist... 😃 )



  • virtuell Realisticer schrieb:

    Aussagekraeftiger? Warum? Was ist an einem

    char* p = reinterpret_cast<char*>(some_pointer);
    

    aussagekraeftiger als bei einem

    char* p = (char*)some_pointer;
    

    ? Warum sollte man hier nicht gleich sehen, was gemeint ist?

    Was ist denn bei

    char* p = (char*)some_pointer;
    

    gemeint?

    some_pointer könnte ein gänzlich unverwandter Typ sein. Wenn es hier nicht gerade um char ginge, könnte es auch ein Zeiger auf eine Basisklasse sein. Vielleicht will der Programmierer aber auch nur einen const/volatile-Qualifizierer loswerden (warum auch immer). Vielleicht auch alles auf einmal. Dem C-Cast kannst du das nicht ansehen.



  • volkard schrieb:

    static_cast nehmen, wo man aufpassen muss. die langen _cast-wörte sind ja extra so lang, damit man sie ungern nimmt und damit sie als gefahrenkennzeichen leuchten

    Dann ist doch das Beispiel eigentlich wie gemacht für static_cast. Da int nicht den Wertebereich von float abdeckt, ist das doch eine nette Fehlerquelle, oder?
    Ich hab mir den functional-cast eigentlich abgewöhnt, da der afaik cv-Kennzeichner wegcastet. War das vielleicht etwas zu voreilig?


Log in to reply