0

次の配列があるとします。

GLfloat vertex[(vertexnm+2)][3];

外側の配列の要素への単純な代入はできません。

vertex[0] = {0.0f, 0.0f, 0.0f};

結果はArray type 'GLfloat [3]' is not assignable.

次の方法が考えられます。

*(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f};

しかし、それは良い解決策ではないようです。これを行うためのきれいな方法はありますか?

4

3 に答える 3

2

残念ながら、配列は C で美化されたポインターにすぎません。つまり、ここでは、期待どおりに (オブジェクトのように) コピーされないことを意味します。

C++11 では、配列の新しい抽象化が導入され、配列が期待どおりに動作するようになりました。たとえば、配列をコピーしたり代入したりできます。arrayC++11 より前のコンパイラ/標準ライブラリでは、TR1のクラスを で使用できますtr1/array

#include <array>

int main() {
  typedef std::array<GLfloat, 3> vertex;
  std::array<vertex, vertexnm + 2> a;
  a[0] = vertex{0, 0, 0};
}
于 2013-06-08T23:52:00.647 に答える
2

C スタイルの配列は確かに単なる "美化されたポインター" ではありませんが、ネイキッド C スタイルの配列は、どのようにスライスしても割り当て可能ではありません。C++11 はその点で何も変更しません。

君の

*(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f};

あなたが思っていることをしません。左側でvertex[0]は、 へのポインターに減衰しvertex[0][0]、これを*. したがって、左側のサイズは単純にvertex[0][0]です。

一方、新しく割り当てられた名前のない配列new GLfloat[3] {0.0f, 0.0f, 0.0f}の要素へのポインターを返します。[0]はその*ポインタを逆参照し、その[0]要素にアクセスできるようにします。

上記は、あなたの割り当てが実際に同等であることを意味します

vertex[0][0] = nameless_dynamic_array[0];

つまり、そうです

vertex[0][0] = 0.0f;

新しい配列がメモリリークになります。

配列全体を割り当てるには、それをクラスにラップする必要があります(std::array標準のラッパーです)。または、何らかの理由で裸の C スタイルの配列を使用する必要がある場合は、std::copyまたはを使用memcpyして、ある配列から別の配列にデータをコピーします。

于 2013-06-09T01:10:49.740 に答える
0

別の方法を次に示します。

 static const int myFirstArray[] = {16,2,77};
 static const int mySecondArray[] = {84,64,1};

 std::vector< std::vector<int> > myArray(3);
 myArray[0] = std::vector<int>(myFirstArray, myFirstArray + sizeof(myFirstArray) / sizeof(myFirstArray[0]) );
 myArray[1] = std::vector<int>(mySecondArray, mySecondArray + sizeof(mySecondArray) / sizeof(mySecondArray[0]) );
 //prints:
 //16 2 77
 //84 64 1
 for (unsigned int i=0;i<myArray.size();++i){
    for (unsigned int j=0;j<myArray[i].size();++j){
        std::cout << myArray[i][j] << " ";
    }
    std::cout << std::endl;
 }
于 2013-06-09T00:11:05.040 に答える