Konvertieren von int* nach float*



  • Hallo,

    ich muss int* nach float* konvertieren, bekomme aber ganz andere Werte. Könnt ihr mir dabei helfen.

    Das ist das Programmstuck:

    int val = 203;
    int* intval = &val;
    float* floatval = (float*)intval;

    Ausgabe: floatval = 2.845e-043#DEN

    Danke im Voraus.



  • int val = 203;
    float valfloat = val;
    


  • Oder wenn du unbedingt Pointer brauchst, dann so:

    int ival = 203; 
        int* intval = &ival; 
        float fval = ival;      // Oder float fval = *intval;
        float* floatval = &fval;
    

    Das Problem in deinem Code war naemlich, dass ein float-Zeiger und ein int-Zeiger nicht auf die gleiche Speicherstelle zeigen koennen. float und int koennen ja unterschiedlich gross sein. Deswegen brauchst du eine zusaetzliche Variable fval.



  • icarus2 schrieb:

    Oder wenn du unbedingt Pointer brauchst, dann so:

    int ival = 203; 
        int* intval = &ival; 
        float fval = ival;      // Oder float fval = *intval;
        float* floatval = &fval;
    

    Das Problem in deinem Code war naemlich, dass ein float-Zeiger und ein int-Zeiger nicht auf die gleiche Speicherstelle zeigen koennen. float und int koennen ja unterschiedlich gross sein. Deswegen brauchst du eine zusaetzliche Variable fval.

    Danke. Das Problem ist nun (jetzt wird geschimpft), dass ich ein fertiges Programm ändern muss, in dem zwei Berechnungen entweder in CPU oder im Prozessor auf der Grafikkarte durchgeführt werden können. Da für die Grafikkarte (CUDA-Bibliothek) float-Werte und für CPU int-Werte benutzt werden und eine Menge von gemeinsamen Funktionen existiert, muss ich nun einen int* zum float* umwandeln und als Parameter an eine Funktion übergeben.

    Somit ist "float fval = ival;" keine Lösung, denn *intval zum Zeitpunkt der Umwandlung bereits mit Inhalt ankommt.



  • Du kannst nicht einfach die Pointer casten wenn du eigentlich den Inhalt ändern willst. Dann muss du schon eben den Inhalt ändern...



  • Vielen Dank für Lösungen. Ich habe das Problem anhand des Beispiels von icarus2 und Kommentar von dot gelöst, wo ich den Inhalt übergeben habe.

    //alt
    int val = 203;
    int* intval = &val;
    //neu
    float* floatval = new float();
    *floatval = fval;



  • Sorry, Fehler aufgetreten. Muss korrigieren

    MimoseG schrieb:

    Vielen Dank für Lösungen. Ich habe das Problem anhand des Beispiels von icarus2 und Kommentar von dot gelöst, wo ich den Inhalt übergeben habe.

    //alt
    int val = 203;
    int* intval = &val;

    //neu
    float fval = intval[0];
    float* floatval = new float();
    *floatval = fval;



  • Bei

    float* floatval = new float();
    

    musst du dann allerdings dran denken, dass du floatval wieder mit delete freigeben musst. Das sollte man moeglichst vermeiden. Was ist denn an meiner Loesung oben nicht gut?

    PS:
    Bitte benutze C++ Code-Tags, dann kann man deinen Code besser lesen.



  • icarus2 schrieb:

    Bei

    float* floatval = new float();
    

    musst du dann allerdings dran denken, dass du floatval wieder mit delete freigeben musst. Das sollte man moeglichst vermeiden. Was ist denn an meiner Loesung oben nicht gut?

    PS:
    Bitte benutze C++ Code-Tags, dann kann man deinen Code besser lesen.

    Deine Lösung ist gut außer dem grünen Kommentar:-), das ich übersehen habe:-(

    Danke für Hinweise. Ich muss aber das Thema jetzt beenden.



  • Was tut denn das new float() da 😮
    Wieso nicht einfach mit einer Schleife über die int Werte laufen und float Werte rausschreiben? Ein simples

    my_floats[i] = static_cast<float>(my_ints[i]);
    

    sollte doch genau das tun was du willst!?


  • Mod

    Selbst den Cast brauchst du dann gar nicht.



  • stimmt, ein simples std::copy() sollt schon ausreichen...


Anmelden zum Antworten