2012-05-01 17 views
2

はのは、私は、配列float floatBuffer[4]を定義していると私は構造体を持っているとしましょう:vec3割り当て前struct vec3{float x,y,z;} myVec;静的配列バッファの割り当て

、私は割り当てる:floatBuffer[3] = 0.0f;

を(これが可能であるならば、)どのような方法ですることができますIは、myVec(バイナリコピー)floatBuffer[0]を割り当てるように[0] == myVec.x

  • floatBuffer [1] == myVec.y
    • floatBuffer
    • floatBuffer [2] == myVec.z
    • floatBuffer [3] ==は0.0f

    +2

    'one go'を定義します。 –

    +0

    'floatbuffer'は静的なので(タイトルから仮定します)、他のゼロ以外のコンパイル時定数を指定しない限り、すべての配列要素はゼロ初期化されます。もちろん、後で変更することもできます。あなたの問題は初期値を指定していますか? – dirkgently

    +0

    @BenjaminLindleyバイナリコピー – xcrypt

    答えて

    1

    明白な答えがある:あなたが構造体のレイアウト上の仮定を作るために喜んでいる場合

    floatBuffer[0] = myVec.x; 
    floatBuffer[1] = myVec.y; 
    floatBuffer[2] = myVec.z; 
    

    、およびあなたのコンパイラが直接割り当てのための安っぽいコードを生成し、あなたの仮定を文書化してくださいmemcpy

    static_assert(sizeof(myVec) == sizeof(float[3]), "myVec should not have padding"); 
    
    memcpy(&floatBuffer[0], &myVec, sizeof(myVec)); 
    
    +1

    宣言を制御できる場合は、float floatBuffer [4] = {myVe​​c.x、myVec.y、myVec.z}; –

    +0

    を実行することができます。Lol;) – xcrypt

    +1

    @xcryptを関数に入れて、その関数を呼び出すと、 "in one go"とカウントされますか? (それは私に) –

    2

    標準パディングさえ内(ただし、先頭の)があるかもしれないことを言うんO f a standard-layout-structなので、バイナリコピーは移植できないかもしれません。しかし、特定のシステムと梱包指示(検索#pragma pack)がある場合は、memcpyを使用することができます。

    あなたは次のことを試すことができます。

    #include <cstring> 
    #include <algorithm> 
    #include <iterator> 
    #include <iostream> 
    
    // look up your compiler's documentation 
    //#pragma pack(4) 
    
    struct fs { 
    float x, y, z; 
    }; 
    
    int main() { 
    fs b = {1.0, 2.0, 3.0}; 
    float p[ 4 ] = {0}; 
    static_assert(sizeof b == sizeof p - 1, "warning: padding detected!"); 
    std::memcpy(&p[ 0 ], &b, sizeof p - 1); 
    std::copy(&p[ 0 ], &p[ 0 ] + 3, std::ostream_iterator<float>(std::cout, "\n")); 
    } 
    
    1

    言及memcpyの梱包に応じて、壊れやすいことができるしかしとして、memcpyのを使用することが可能です。

    私はここで最善の解決策は、複数のステートメントを使用するとトリッキーではないと思う。それを明白な方法を行うことにより

    floatBuffer[0] = myVec.x; 
    floatBuffer[1] = myVec.y; 
    floatBuffer[2] = myVec.z; 
    

    ... コードは何が起こっているのかを明確であり、あなたは、コンパイラはあなたのためのコードを最適化させることができます。あなたはこのための関数を作ることができ

    +0

    私はfloatbufferが何かを表現できるようにしたいので。たとえば、DirectX頂点バッファ内の頂点を表現する場合 – xcrypt

    +0

    作業対象となる型の組み合わせを考えてみることもできます。 – MessyHack

    +0

    これは良いアプローチのようです。どうも – xcrypt

    1

    (単一代入を可能にする)float配列ではなく、vec3かvec3配列のいずれかを使用している理由を気にしていない

    一つの疑問、 です。

    struct vec3{float x,y,z;} myVec; 
    
    float* operator<< (float t[4], vec3 v) { 
        t[0] = v.x; t[1] = v.y; t[2] = v.z; t[3] = 0; 
        return t; 
    } 
    
    int main() { 
        float test[4]; 
        test << myVec; // now do the assignment 'in one go' 
        return 0; 
    } 
    
    関連する問題