2016-08-01 9 views
0

Ich habe ein Float-Array in C#, die Daten speichert. Allerdings muss ich die Daten in Strukturen wie Vector2, Vector3 usw. umwandeln. Die Strukturen enthalten nur Gleitkommazahlen, daher gibt es keine Datentypkonvertierung in Bezug auf Bytes, nur im Zugriff.C# Cast Float-Array zu Struktur von Floats

Eg .:

struct Vector3 
{ 
    public float x; 
    public float y; 
    public float z; 

    //plus some methods 
} 

ich das ganze float-Array auf die Struktur eines manuell durch Erstellen eines neuen Arrays kopieren können, aber das ist etwas langsam für große. Ich habe versucht, Konvertierung in unsicheren Code zu tun, aber die Verwendung von generischen funktioniert nicht und das Erstellen spezieller Methode für jede Struktur, die ich habe, ist irgendwie "komisch".

In C++ Ich habe so etwas wie dies:

float * arrayFloat = .... 
Vector3 * arrayVector3 = reinterpret_cast<Vector3 *>(arrayFloat); 

aber das ist keine Option in C# ...

Irgendwelche Ideen, wie dies zu erreichen, oder wie man das Design ändern?

+3

* "In C++ habe ich etwas wie das:" * Nein, Sie nicht, dies verletzt strenge Aliasing. (Auch Padding, und was auch immer zusätzliche Aromen von UB Sie treffen können.) –

+0

Ich habe C++ - Struktur mit Padding-Ausrichtung und es sollte "Safe" unter MSVC Compiler –

+0

Warum nicht speichern das Array in der 'Vector2',' Vector3',. .. Klasse statt drei 'doppelte' Werte? Dann müssten Sie nur das interne Array von 'Vector3' auf das gegebene Array setzen und es würde kein Kopieren mehr stattfinden. – Kjara

Antwort

3

Sie einen Konstruktor Ihre Struktur könnte hinzufügen:

struct Vector3 
{ 
    public float x; 
    public float y; 
    public float z; 

    public Vector3(float[] vals) 
    { 
     if(vals.Length != 3) 
     throw new ArgumentException(); 
     x = vals[0]; y = vals[1]; z = vals[2]; 
    } 
} 

... anderswo

float[] myFloats = { 0.0f, 1.1f, 2.2f }; 
var myVec = new Vector3(myFloats); 

wenn Sie fragen, ob es etwas ist, dass Sie dies ohne jede Arbeit tun lässt die Antwort ist nein. Jede Konvertierung von einem Array in eine Struktur Ihrer Wahl muss von Ihnen implementiert werden, vorzugsweise in Ihrer Struktur.