Typkonvertierungsproblem
-
sqrt(-1) schrieb:
Und warum steht dieser in Klammerund und hat den Adressoperator davor?
Das & steht hier nicht für AdressOf, sondern Referenz. Und warum das in Klammern stehen muss? Das kann ich dir auch nicht genau beantworten, das hat wohl was mit dem Typsystem von C++ zu tun.
sqrt(-1) schrieb:
Doch, ein Element ist eben 3*float.
Und davon gibt es wiederum mehrere Elemente.OK, also 2-dimensionale Arrays. Wenn die in nativer Form vorliegen, zB
float a[10][3];
dann kannst du meine Templatefunktion trotzdem nutzen. Dann ist ein Element halt nicht vom Typ float, sondern 'float[3]'. Mit ein bisschen Meta-Programming kann man dann noch relativ einfach 'float' und '3' separieren.
So wie ich dich verstehe, hast du aber lediglich einen Zeiger auf das erste Element. Also musst du auf die Variante von Power Off zurückgreifenvoid SchreibeArray( const T* Quelle, size_t ArrayGroesse )
T wäre dann zB 'float[3]', und für 'ArrayGroesse' musst du halt die Anzahl der 'float[3]' Elemente angeben. Die musst du ja irgendwann mal spezifiziert haben.
sqrt(-1) schrieb:
Das habe ich nur falsch übernommen.
In Wirklichkeit verwende ich auch die gleiche Größe.Das solltest du aber besser lassen. 8 Byte struct Grösse mal 100000 Elemente? Da kann dein Stack schon mal aufgebraucht sein. Besser du handelst sowas dann mit dynamischem Speicher.
-
groovemaster schrieb:
Das & steht hier nicht für AdressOf, sondern Referenz. Und warum das in Klammern stehen muss? Das kann ich dir auch nicht genau beantworten, das hat wohl was mit dem Typsystem von C++ zu tun.
Aber warum nimmst du da nicht einfach nur ein einfaches "Elemente" anstatt des "(&Elemente)"?
void schreibeArray(const ElementTyp (&Elemente)[Anzahl])
dann kannst du meine Templatefunktion trotzdem nutzen. Dann ist ein Element halt nicht vom Typ float, sondern 'float[3]'. Mit ein bisschen Meta-Programming kann man dann noch relativ einfach 'float' und '3' separieren.
So wie ich dich verstehe, hast du aber lediglich einen Zeiger auf das erste Element. Also musst du auf die Variante von Power Off zurückgreifenvoid SchreibeArray( const T* Quelle, size_t ArrayGroesse )
T wäre dann zB 'float[3]', und für 'ArrayGroesse' musst du halt die Anzahl der 'float[3]' Elemente angeben. Die musst du ja irgendwann mal spezifiziert haben.
Ja, so brauche ich dies auch und habe es auch so implementiert.
Das solltest du aber besser lassen. 8 Byte struct Grösse mal 100000 Elemente? Da kann dein Stack schon mal aufgebraucht sein. Besser du handelst sowas dann mit dynamischem Speicher.
Auch wenn ich die Arrays auf dem Heap anlege stüzt das Programm wo ich die DLL nutze gelegentlich einfach so ab wenn ich die LogArray Funktion aufrufe.
Das komische ist, dass sich dies nicht reproduzieren lässt.
-
sqrt(-1) schrieb:
Aber warum nimmst du da nicht einfach nur ein einfaches "Elemente" anstatt des "(&Elemente)"?
Weil es ohne Referenzen nunmal nicht funktioniert. Das liegt wohl daran, dass by-value übergebene Arrays nicht wirklich by-value gehandelt werden, sondern lediglich per Zeiger auf das erste Element.
sqrt(-1) schrieb:
Auch wenn ich die Arrays auf dem Heap anlege stüzt das Programm wo ich die DLL nutze gelegentlich einfach so ab wenn ich die LogArray Funktion aufrufe.
Das komische ist, dass sich dies nicht reproduzieren lässt.Sowas ist immer schlecht, da es hier auch keinen Sinn macht, mit einem Debugger ranzugehen. Leider kann ich dir da auch nicht weiterhelfen, da dein Code einfach zu unvollständig bzw undurchsichtig ist. Das einzige was ich dir empfehlen kann, ist Exception Handling in Verbindung mit dem Laufzeit Debugging deines Compilers zu nutzen. Der aktuelle MS Compiler bietet hier zB relativ gute Möglichkeiten.