2017-12-19 27 views
0

저는 C++에서 새로운 문제가 있습니다. 나는 3D 좌표를 만들고 있는데 (얼굴의 각 모서리마다 x, y, z, 그리고 나서 6 개의 얼굴), 많은 오류가 발생합니다. 여기 내 코드 :"이니셜 라이저 목록"에서 변환 할 수 없습니다

#include <vector> 
int main() 
{ 
    std::vector<int> xyzCoords = { 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
    }; 

    int x1 = 0; 
    int y1 = 1; 
    int z1 = 2; 
    int x2 = 3; 
    int y2 = 4; 
    int z2 = 5; 

    xyzCoords = { 
    { x1, y1, z1, x2, y1, z1, x2, y1, z2, x1, y1, z2 }, 
    { x1, y2, z1, x2, y2, z1, x2, y2, z2, x1, y2, z2 }, 
    { x1, y2, z1, x1, y1, z1, x1, y1, z2, x1, y2, z2 }, 
    { x2, y2, z1, x2, y1, z1, x2, y1, z2, x2, y2, z2 }, 
    { x1, y2, z2, x1, y1, z2, x2, y1, z2, x2, y2, z2 }, 
    { x1, y2, z1, x1, y1, z1, x2, y1, z1, x2, y2, z1 } 
    }; 
    return 0; 
} 

이 코드는 문제가 발생하는 곳입니다. 당신은 벡터로 xyzCoords을 정의하는 것을 볼 수 있습니다. 이것이 올바른 방법인지 확실하지 않습니다. 또한 xyz123을 별도로 정의하고 싶지 않습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 목록, 배열 또는 벡터를 사용해야합니까? 이를 수행하는 방법에 대한 코드를 작성하십시오. 감사! 오류 :

E0289 "[_Ty = INT, _Alloc = 성병 :: 할당] 표준 : 벡터 < _Ty, _Alloc> :: 벡터"생성자 인스턴스 x는 인수리스트

에게 맞는 E0349 : 더 연산자 "="이 피연산자를 일치하지

C2440 : 이진 '=': '표준 : : 벡터>'

C2679에 '이니셜 라이저 목록'에서 변환 할 수 없습니다 : '초기화'에는 운영자가 발견되는 '이니셜 라이저 목록'유형의 오른쪽 피연산자를받습니다 (또는 수락 가능한 컨버전스가 없습니다.) 시온)

+1

중첩 된'{}'이 제거되었습니다. –

+3

무엇이 ''입니까? – juanchopanza

+0

@juanchopanza, 당신은 혀를 뺨에 그림 이모를 잊어 버렸습니다 :) –

답변

1

초기화가 선언 한 유형과 일치하지 않습니다. 초기화는 2D 배열 인 반면에 1D 배열을 선언합니다.

std::vector<int> xyzCoords = { 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
}; 

그것은해야한다 :

std::vector<std::vector<int>> xyzCoords = { 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
}; 

당신은 약 xyz 좌표 언급, 그렇게하지 않는 이유는 예를 들어, 특별히 사용되는 클래스는 좌표합니다 어쨌든

struct Point { 
    int x, y, z; 
}; 

, 행렬 연산 집약적 인 계산이므로이 문제에 대한 순진한 접근 방식을 사용하지 않는 것이 좋습니다. BLAS/LAPACK 라이브러리 또는 Eigen 또는 Armadillo과 같은 래퍼를 사용해야합니다. 그들은 분명히 훨씬 빠릅니다.

+0

이것을 보내 주셔서 감사합니다! 내가 가진 문제를 어떻게 해결할 수 있었는지 설명 했다니 다행이다. 느리기 때문에 코드를 약간 변경해야합니다. –

2

은 아마 당신은 가시성과 더 나은 이해를 위해,이 같은 뭔가 코드를 재구성해야합니다

#include <vector> 

int main() 
{ 
    struct Corner 
    { 
     int x; 
     int y; 
     int z; 
     Corner(int x, int y, int z) : 
      x(x), y(y), z(z) {} 
    }; 

    struct Face 
    { 
     Corner c1; 
     Corner c2; 
     Corner c3; 
     Corner c4; 
     Face(Corner c1, Corner c2, Corner c3, Corner c4) : 
      c1(c1), c2(c2), c3(c3), c4(c4) {} 
    }; 

    Corner c1(0, 1, 2); 
    Corner c2(3, 4, 5); 
    Face f1(c1, c2, c1, c2); 

    std::vector<Face> faces = { f1, f1, f1, f1, f1, f1 }; 

    return 0; 
} 

이 코너의 좌표 (6 개면의 배열을 만듭니다 X1, Y1, Z1) (x2, y2, z2)

2
#include <vector> 

struct Vertex { 
    float x_; // can change these to int 
    float y_; 
    float z_; 
    Vertex() : x_(0), y_(0), z_(0) {} 
    Vertex(float x, float y, float z) : x_(x), y_(y), z_(z) {} 
    explicit Vertex(float val) : x_(val), y_(val), z_(val) {} 
}; 

struct Face { 
    Vertex v0_; 
    Vertex v1_; 
    Vertex v2_; 
    Vertex v3_; 

    Face() : 
    v0_(Vertex()), 
    v1_(Vertex()), 
    v2_(Vertex()), 
    v3_(Vertex()) { 
    } 

    Face(Vertex v0, Vertex v1, Vertex v2, Vertex v3) : 
    v0_(v0), 
    v1_(v1), 
    v2_(v2), 
    v3_(v3) { 
    }   
}; 

int main() { 
    std::vector<Face> faces; 

    // Not exact values the OP is looking for, 
    // just a quick way to populate the vector of faces 
    // for demonstration purposes of the usefulness of structs & classes. 
    for (unsigned n = 1; n <= 6; n++) { 
     faces.push_back(Face(Vertex(n), Vertex(n+1), Vertex(n+2), Vertex(n+3))); 
    }   

    return 0; 
}