2012-03-19 5 views
0

Я хотел создать трехмерный массив в следующем коде, но я получаю ошибку времени выполнения.Как создать трехмерный динамический массив

int dim1,dim2,dim3; 
std::cout<<"dim one\n"; 
std::cin>>dim1; 
std::cout<<"dim two\n"; 
std::cin>>dim2; 
std::cout<<"dim three\n"; 
std::cin>>dim3; 

int ***three_dim=0; 
three_dim=new int**[dim1]; 
for(int i=0;i<dim1;++i) 
    three_dim[i]=new int*[dim2]; 

for(int k=0;k<dim2;++k) 
    three_dim[k]=new int*[dim3]; 
for(int k=0;k<dim1;++k) 
for(int i=0;i<dim2;++i) 
    for(int j=0;j<dim3;++j) 
     three_dim[k][i][j]=0; 

EDIT:

это является обязательным условием, что я использовать трехмерный массив. Я создал двухмерный массив с тем же стилем и хотел бы расширить его до трех, потому что это то, что мне нужно. Но, как вы видите, я смутился.

Спасибо Бо Перссон

+0

a) Оберните одномерный массив в классе и выполните сами индексы-математику. B) Используйте вектор векторов векторов ints. C) Используйте boost :: multi_array. Просто не делай того, что делаешь прямо сейчас. – jrok

+1

Каждый раз, когда вы пишете '***', и это не комментарий, будильники должны уходить в голове. –

+0

Да, [Программист трех звезд] (http://c2.com/cgi/wiki?ThreeStarProgrammer) –

ответ

2

Эта часть

for(int k=0;k<dim2;++k) 
    three_dim[k]=new int*[dim3]; 

есть две проблемы. Одним из них является то, что выделяется int* вместо int. Другой, более серьезный, заключается в том, что он перезаписывает ранее выделенные указатели из строк выше.

Вы должны, вероятно, сделать выделение, как это:

for(int i=0;i<dim1;++i) 
{ 
    three_dim[i]=new int*[dim2]; 

    for(int k=0;k<dim2;++k) 
     three_dim[i][k]=new int[dim3]; 
} 
1

Выполнение такого рода вещи с указателями только получит вас в конце концов.

Одним из простых способов сделать это, если вам действительно нужен трехмерный массив, является использование вложенных контейнеров STL. То есть std::vector<std::vector<std::vector<int>>>>.

Убедитесь, что вы решаете правильную проблему. Я не говорю, что вы нет, но я просто чувствую, что вы можете решить его без трехмерного массива, который может быть зверюшкой, особенно если вам не нравятся указатели.