2016-08-01 4 views
0

データを格納するC#に浮動小数点配列があります。しかし、私はVector2、Vector3などの構造体にデータをキャストする必要があります。構造体は浮動小数点のみを保持しているため、データ型の変換はバイト単位ではなく、アクセス時にのみ行われます。浮動小数点数の構造体へのC#のキャスト浮動小数点配列

例:。:

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

    //plus some methods 
} 

私は手動で新しい配列を作成することにより、構造体1の全体float配列をコピーすることができますが、それは一種の遅い大きなもののためです。私は安全でないコードで変換をしようとしましたが、ジェネリックを使用していないと私は持っているすべての構造体のための特別なメソッドを作成する "奇妙な"のようなものです。 Cでは

++私はこのようなものがあります:

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

をそれはC#でのオプションではありません...

任意のアイデアはどのようにこれを達成するために、またはどのようにデザインを変更しますか?

+3

* "C++では次のようなものがあります。" *いいえ、厳密なエイリアシングには違反しています。 (埋め込みなど、UBの他のフレーバーを打つこともできます) –

+0

パディングアラインメントのC++構造体があり、MSVCコンパイラで「安全」である必要があります。 –

+0

配列を 'Vector2'、' Vector3'、。 .. 3つの 'double'値の代わりにクラス?次に、 'Vector3'の内部配列を指定された配列に設定するだけで、コピーは行われません。 – Kjara

答えて

3

あなたは構造体にコンストラクタを追加することができます。

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]; 
    } 
} 

...他の場所

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

あなたがどんな作業をせずにこれを行うことができます何かがある場合は、あなたが求めている場合は、答えはいいえ。配列から選択した構造体への変換はすべて、あなたの構造体に実装する必要があります。

関連する問題