2013-06-08 2 views
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}; 

Но это не похоже, что это хорошее решение. Есть ли чистый способ сделать это?

+0

Вы можете использовать 'std :: array'. – celtschk

ответ

2

К сожалению, массивы являются лишь немногим более, чем прославленные указатели в C, которые , например. означает, что они не копируются так, как вы ожидаете (например, как объекты).

C++ 11 представляет новую абстракцию для массивов, которые делают массивы более значительными, чем вы ожидаете, например, . они могут быть скопированы или назначены. С помощью компиляторов/стандартных библиотек pre-C++ 11 вы можете использовать класс array от 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}; 
} 
+1

'A' должно быть' vertex' в вашем примере, не так ли? – Appleshell

+0

@AdamS: Конечно. –

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; 
} 
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 для копирования данных из одного массива в другой.

Смежные вопросы