float to void*
-
Hallo,
vorneweg: Ich weiss, dass void* wirklich hässlich ist, aber meine Idee war das auch nicht

Ich habe eine Bibliothek, die mir eine Funktion bereitstellt, welche leider einen (float)-Parameter als void* erwartet.
Also muss ich float nach void* casten, aber bei allen bisherigen Versuchen beschwert sich mein Compiler aufs Bitterste.
Wie macht man so etwas?Danke.
lg
sinthoras
-
Lässt sich mit reinterpret_cast machen.
Bist du sicher, dass die Funktion nicht einen nach void* gecasteten float-Zeiger erwartet?
-
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*nachvoid*geht implizit, wobeiTein beliebiger Datentyp ist. In umgekehrter Richtung benötigst dustatic_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).
-
&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 einenvoid-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
**intgibts nicht, wenn schonint**.
-
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
**intgibts nicht, wenn schonint**.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 einenint**rumwürgen? Das geht nicht vernünftig. Oder hast du einint[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 einenint*innerhalb der Funktion verändern, was einemint*&-Parameter gleichkommen würde. Aber es geht doch um Arrays. Einint[size]-Array kanns wegen der zweifachen Indirektion jedoch nicht sein, zumindest nicht ohne Würgen.Fragen über Fragen...
