2012-05-01 9 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'는 정적이기 때문에 (제목에서 가정 함) 모든 배열 요소는 0이 아닌 컴파일 타임 상수를 제공하지 않는 한 0으로 초기화됩니다. 물론 나중에 수정할 수 있습니다. 문제가 초기 값을 지정하고 있습니까? – 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] = {myVec.x, myVec.y, myVec.z}; –

    +0

    할 수 있습니다.Lol;) – xcrypt

    +1

    @xcrypt를 함수에 넣은 다음 해당 함수를 호출하면 "한번에"계산됩니까? (그것은 나에게) –

    2

    표준 패딩도 내에서 (그러나 처음에)있을 수 있음을 말하는가 오 f 표준 레이아웃 구조체이므로 이진 복사본은 이식 가능하지 않을 수 있습니다. 그러나 특정 시스템 및 포장 지침 (검색 #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

    는 방어 적이기를 사용하는 것이 가능, 방어 적이기는 포장에 따라 취약 할 수 있습니다 언급 그러나한다.

    여기서 가장 좋은 해결책은 여러 문장을 사용하는 것이 아니라 까다로울 것이라고 생각합니다.

    그것에게 확실한 방법을 수행함으로써
    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; 
    }