Cast zwischen Struktur und Array



  • Hi C++ Community!

    Ist es in C++ möglich einen Cast zwischen einer Struktur und einem Array auszuführen, wenn beide die gleiche Anzahl an Elementen des gleichen Typs besitzen?

    Also so etwas:

    typedef struct MyVector3D {
    	float x;
    	float y;
    	float z;
    } MyVector3D;
    
    int main(int argc, _TCHAR* argv[]) {
    	float myArray[3] = {1.0f, 2.0f, 3.0f};
    	MyVector3D myVec = {4.0f, 5.0f, 6.0f};
    
    	MyVector3D myVec2 = myArray; // Error
    
    	return 0;
    }
    

    Beste Grüße und eine schöne Adventszeit!


  • Mod

    Ja, das ist dir garantiert, dass das vom Layout her kompatibel ist. Aber ein reinterpret_cast ist trotzdem nötig. Und eine Zuweisung wie du das da versuchst, ist kein Cast.



  • Nun ja, selbst wenn du das irgendwie casten könntest, ist nicht garantiert, dass das auch funktioniert, da nicht garantiert ist, dass die Member in einem struct direkt hintereinanderliegen. (Stichwort: Padding)
    Somit fällt leider auch die memcpy Lösung weg.
    Aber wozu genau brauchst du das? Ich würde einen Vektor übrigens eher mit float[3] und x() y() z() Memberfunktionen erstellen.



  • Derzeit greife ich häufig auf D3DXVECTOR3 zurück.
    In vielen Situationen möchte man aber lieber mit einem float[3] Array arbeiten.

    Das läuft jetzt wohl auf eine eigene Mathe Bibliothek hinaus. Irgendwelche Open Source Empfehlungen?


  • Mod

    Tafelwerk schrieb:

    Das läuft jetzt wohl auf eine eigene Mathe Bibliothek hinaus. Irgendwelche Open Source Empfehlungen?

    😕 Wie kommst du denn jetzt von Struct-zu-Arrays-Casts zu Mathebibliotheken? Was soll die können? Welche Anforderungen soll sie erfüllen?



  • Ich sehe das Problem nicht, drei Variablen als Parameter zu übergeben ...
    Naja und es gibt ja noch die Möglichkeit, dass du ein float a[3] in eine
    Struktur packst ...



  • @Sepp: Bisher nutze ich die Mathe-Bibliothek von DirectX und damit D3DXVECTOR3. Wenn ich nun D3DXVECTOR3 austauschen würde, wäre es sinnvoll auch die restlichen Abhängigkeiten von d3dx10math.h zu beenden.

    Eine wichtige Anforderung an die Vektor-Repräsentation ist, dass sie leicht nach float[3] konvertiert werden kann.

    Ist folgende Konvertierung sicher?

    float* myArray2 = (float*)&myVec;
    

    Dann würde D3DXVECTOR3 auch weiterhin meine Bedürfnisse erfüllen. Es war etwas ungeschickt von mir, im vorherigen Beispiel den umgekehrten Fall aufzuführen.

    Grüße



  • Big Brother schrieb:

    Ich sehe das Problem nicht, drei Variablen als Parameter zu übergeben ...

    Wenn die drei Variablen zusammengehören wie in diesem Fall, ist das durchaus angebracht, sie auch zusammen durch die Gegend zu schubsen 😉

    Naja und es gibt ja noch die Möglichkeit, dass du ein float a[3] in eine
    Struktur packst ...

    Das ändert nichts daran, dass D3DXVECTOR3 kein Array speichert und deshalb auch nicht in eins konvertiert werden kann - egal ob ein struct drumrum ist oder nicht.



  • Nein, die Konvertierung ist nicht sicher. Bzw. sie wäre sicher, wenn die DXlib ein Array nutzen würde, aber wenn sie das nicht tut, hast du genau das gleiche Problem wie vorher. Je nach dem was du brauchst, ist eine eigene Mathe-lib aber nicht sonderlich schwer. Wenn du den Vektor so baust, kann nichts schief gehen:

    class Vector3f // Ist natürlich ein Template für Größe und Typ
    {
      float data_[3];
    public:
      ...
      // operator [] etc.
    };
    
    int main()
    {
      Vector3f v(3, 4, 5);
      // Und dann Zugriff mit &v[0]
    }
    

    Allerdings, wenn du dich mit DirectX eh auf Windows festlegst, werden vielleicht auch bestimmte Padding-Eigenschaften garantiert. (VS wird das auf jeden Fall machen.)
    Von daher könntest du auch einfach den Standard links liegen lassen.


Anmelden zum Antworten