float to void*



  • Nein, bin ich nicht.
    Die Dokumentation ist naja...



  • reinterpret_cast<> hatte ich auch schon versucht, liefert:
    error: invalid cast from type 'float' to type 'void*'
    Ich versuche es mal mit dem Pointer, danke.

    Edit: Alles klar, er kompiliert jetzt.
    Mal gucken, ob das Gerät das so akzeptiert, das ist gerade nicht zugegen 🙂
    Danke.



  • Die Konvertierung von T* nach void* geht implizit, wobei T ein beliebiger Datentyp ist. In umgekehrter Richtung benötigst du static_cast .



  • float direkt nach void* geht tatsächlich nicht.
    Falls es sich herausstellt, dass das Gerät doch keinen Zeiger erwartet, geht es notfalls auch mit Umweg über int:

    float float_val=5;
    void* blubb=reinterpret_cast<void*>(*reinterpret_cast<int*>(&float_val));
    

    Setzt voraus, dass sizeof(void*)=sizeof(int)=sizeof(float).


  • Mod

    &float_val ist aber wieder ein float*.



  • Sinthoras, könntest du uns die Dokumentation der Funktion posten?



  • Liebend gern würde ich die posten...
    Das einzige, was da dokumentiert ist, ist genau der Aufruf:
    funktion( . , ., . , void *param);
    Und da muss eine Zahl rein, ein float eben.



  • SeppJ schrieb:

    &float_val ist aber wieder ein float*.

    Wird aber als int* wieder dereferenziert.



  • Ich denke eigentlich eher, dass ein Zeiger (also float* ) erwartet wird. Man kann doch von vernünftigen Menschen nicht erwarten, dass sie eine Fliesskommazahl gewaltsam in einen void -Zeiger deformieren...

    Funktioniert denn der Aufruf mit &float_val ? Semantisch zur Laufzeit meine ich.



  • verstehe ich hier etwas falsch, oder warum nicht einfach so?

    void foo(void* param)
    {
       float floatVar = *static_cast<float*>(param);
       std::cout << floatVar << std::endl;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
       float floatVar = 3.14;
    
       foo(&floatVar);
    
       return 0;
    }
    


  • BigNeal schrieb:

    verstehe ich hier etwas falsch, oder warum nicht einfach so?

    Wir sind ja nach wie vor am spekulieren. Mein Vorschlag war übrigens der selbe... 😉



  • man sollte nicht TV schauen neben dem Tippen 😉

    Ich denke eigentlich eher, dass ein Zeiger (also float*) erwartet wird. Man kann doch von vernünftigen Menschen nicht erwarten, dass sie eine Fliesskommazahl gewaltsam in einen void-Zeiger deformieren...

    genau dem schliesse ich mich an. Wenn ich void* sehe, gehe ich primär mal davon aus, dass ein Zeiger auf ein Objekt/Variable erwartet wird.



  • Auch wenns es nicht mehr so ganz passt, würde ich gern noch eine Frage nachschieben:
    Eine Funktion erwartet einen **int, in die die Ausgabe geschrieben wird.
    Wie bekomme ich sowas in ein int array?

    Edit: Also der **int soll ein Rückgabeparameter sein, falls das jetzt ungenau formuliert war.



  • Ich hoffe mal, die Funktion will wirklich einen float* als void* haben.
    Aber bei dieser Bibliothek sollte man alle andere nicht ausschliessen 🙂
    Danke auf jeden Fall.



  • Sinthoras schrieb:

    Edit: Also der **int soll ein Rückgabeparameter sein, falls das jetzt ungenau formuliert war.

    Danke, aber dieser Satz ist die Ungenauigkeit höchstselbst. Entscheide dich für Rückgabewert oder Parameter. Meinst du etwa Output-Parameter?

    Und **int gibts nicht, wenn schon int** .



  • Nexus schrieb:

    Sinthoras schrieb:

    Edit: Also der **int soll ein Rückgabeparameter sein, falls das jetzt ungenau formuliert war.

    Danke, aber dieser Satz ist die Ungenauigkeit höchstselbst. Entscheide dich für Rückgabewert oder Parameter.

    Und **int gibts nicht, wenn schon int** .

    Ja, klar. int** meine ich, sorry 🙂
    Ich übergebe der Funktion einen Parameter, in den sie das Ergebnis schreibt.



  • Theoretisch macht man das so:

    int **array = new int*[2];
    array[0] = new int[5];
    array[1] = new int[7];
    mysterioese_funktion(array);
    

    Ich denke mal nicht, dass die Funktion ein direktes 2-dimensionales Array erwartet, dann wäre der Typ z.B. int(*)[10] .



  • Also doch Output-Parameter. 😉

    Sorry, das hat mich zuerst tatsächlich verwirrt. Doch jetzt, wo die formale Verwirrung geklärt ist, können wir uns voll und ganz der inhaltlichen zuwenden. 😃

    Sinthoras schrieb:

    Eine Funktion erwartet einen [int**], in die die Ausgabe geschrieben wird.
    Wie bekomme ich sowas in ein int array?

    Hast du ausserhalb der Funktion ein int[size] -Array und willst das in einen int** rumwürgen? Das geht nicht vernünftig. Oder hast du ein int[width][height] -Array?

    Sag am besten, was (semantisch, nicht nur Typ) der int** -Parameter repräsentiert und was du als Aufrufer damit anfangen willst.



  • ipsec schrieb:

    Theoretisch macht man das so:

    int **array = new int*[2];
    array[0] = new int[5];
    array[1] = new int[7];
    mysterioese_funktion(array);
    

    Wenn, dann aber ohne Initialisierung vor dem Aufruf, es handelt sich ja um einen reinen Output-Parameter.

    Andererseits kann man dann wegen der Kopie des int** nur einen int* innerhalb der Funktion verändern, was einem int*& -Parameter gleichkommen würde. Aber es geht doch um Arrays. Ein int[size] -Array kanns wegen der zweifachen Indirektion jedoch nicht sein, zumindest nicht ohne Würgen.

    Fragen über Fragen... 😕



  • Nexus schrieb:

    Wenn, dann aber ohne Initialisierung vor dem Aufruf, es handelt sich ja um einen reinen Output-Parameter.

    Naja ich dachte an sowas:

    void mysterioese_funktion(int **out)
    {
        out[0][3] = 42;
        out[1][5] = 10^10^10^32;
    }
    

    Aber natürlich kann ich mich auch irren.


Anmelden zum Antworten