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 为数组引入了一种新的抽象,它使数组的行为更像你所期望的,例如它们可以被复制或分配。使用 C++11 之前的编译器/标准库,您可以使用arrayTR1 中的类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 回答