2017-12-19 29 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 = STDと::アロケータ]のstd ::ベクトル< _Ty、_Alloc> ::ベクター" コンストラクタのインスタンスは、引数リスト

に一致しますE0349:なし演算子は "=" これらのオペランドに一致しない

C2440:バイナリ '=': 'のstd ::ベクトル>'

C2679に '初期化子リスト' から変換することはできません。 '初期化' は、オペレータが見つかりませんでした'initializer list'型の右辺のオペランドを取るシオン)

+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、z1)(x2、y2、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; 
} 
関連する問題