Страница 1 из 1
Трехмерный динамический массив, С++
Добавлено: 16 мар 2008, 00:59
Pin
Помогите, пожалуйста, разобраться с такой задачкой:
Нужно создать трехмерный динамический массив и ввести какие-то значения.
Проблема, собственно, в корректном создании самого массива и обращении к отдельным его элементам.
Можно ли написать так?:
{
int A,B,C;
// вычисляются значения А,В и С
int **p=new int*[A];
[INDENT]for (int i=0; i<A;i++)
{
p
=new int ;
[INDENT]for (int j=0; j<B; j++)
{
[INDENT]p[j]= new int [C];[/INDENT]
} [/INDENT]
}[/INDENT]
//Пытаюсь сформировать значения:
for (int r=0; r<A; r++)
{
[INDENT]for (int w=0; w<B; w++)
{
[INDENT]for (int x=0; x<C; x++)
{
[INDENT]std::cout<<"Num:";
std::cin>>Num;
p[w][x]=Num;[/INDENT]
}[/INDENT]
}[/INDENT]
}
//Тоже вроде все ок. Но я не знаю, как проверить результат и у меня не получается нормально вывести на экран все эти значения.
[INDENT]for (int r=0; r<A; r++)
{
[INDENT]for (int w=0; w<B; w++)
{
[INDENT]for (int x=0; x<C; x++)
{
[INDENT]int Res= p[w][x];
std::cout<<Res;[/INDENT]
}[/INDENT]
}[/INDENT]
std::cout<<'\n';
}[/INDENT]
}
Не поможете новичку-любителю ? А то я совсем запуталась 
Re: Трехмерный динамический массив, С++
Добавлено: 16 мар 2008, 19:21
ssDev
Как все сложно
Лудьше попробуй так:
пусть номер элемента массива XxYxZ получается по формуле
i=z*(X*Y)+y*X+x
смысл этой формулы в том, что каждая плоскость xy смещается относительно z=0 на X*Y ячеяк, а каждая строка вдоль x смещается на X ячеяк относительно y=0
хм..
вобщем сама разберешся
теперь тебе надо выделить массив
a = new int[X*Y*Z];
и написать функцию
что то вроде
int getInd(int x,int y,int z){return z*(X*Y)+y*X+x;}
и пользуйся на здоровье
u=a[getInd(2,0,5)];
a[getInd(2,0,5)]=1;
-----------------------------------
а по поводу твоей программы то извини но она целиком ошибочна, ты дважды выделяеш память в одну и туже переменную, а дальше полная абракодабра.
Re: Трехмерный динамический массив, С++
Добавлено: 17 мар 2008, 09:01
airyashov
вот пример разберитесь, если надо очень динамический, то структуру или класс описывать предеться, с размерностями.
Код: Выделить всё
#include <iostream.h>
#include <stdlib.h>
int main(void)
{
int*** mas3d=new int**[10];
int i,j,k;
for(i=0;i<10;i++) mas3d[i]=new int*[9];
for(i=0;i<10;i++)
for(j=0;j<9;j++) mas3d[i][j]=new int[8];
for(i=0;i<10;i++)
for(j=0;j<9;j++)
for(k=0;k<8;k++) mas3d[i][j][k]=rand();
cout<<"mas3d"<<endl;
mas3d[1][2][1]=1;
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
for(k=0;k<8;k++)
cout<<'['<<i<<"]["<<j<<"]["<<k<<"]="
<<mas3d[i][j][k]<<endl;
cout<<endl;
cin.get();
};
cout<<endl;
};
cin.get();
return 0;
}
Re: Трехмерный динамический массив, С++
Добавлено: 17 мар 2008, 13:20
Pin
Спасибо огромное! Сейчас буду разбираться

Re: Трехмерный динамический массив, С++
Добавлено: 29 июл 2009, 15:09
superregistr
Здравствуйте. Спасибо за пример. Очень наглядный. Но у меня возникла другая проблема. Вот код:
Код: Выделить всё
// нахожу dim1
// создаю A размерностью [dim1][3][3]
float ***A = new float**[dim1];
for (int i=0; i<dim1; i++) A[i]=new float*[3];
for (int i=0; i<dim1; i++) for (int j=0; j<3; j++) A[i][j]=new float[3];
// удаляю A размерностью [dim1][3][3]
for (int i=0; i<dim1; i++) for (int j=0; j<3; j++) delete[] A[i][j];
for (int i=0; i<dim1; i++) delete[] A[i];
delete[] A;
// нахожу dim2
// на этом шаге возникает ошибка с редекларацией
// создаю A размерностью [dim2][3][3]
float ***A = new float**[dim2];
for (int i=0; i<dim2; i++) A[i]=new float*[3];
for (int i=0; i<dim2; i++) for (int j=0; j<3; j++) A[i][j]=new float[3];
Массив A находится в цикле, поэтому я не могу назвать его как то по другому, например, A2. Массив A должен переопределяться по размерности dim в цикле. Помогите, пожалуйста: как обойти эту проблему?
Re: Трехмерный динамический массив, С++
Добавлено: 12 авг 2009, 19:37
TDUTY
superregistr писал(а):Здравствуйте. Спасибо за пример. Очень наглядный. Но у меня возникла другая проблема. Вот код:
Код: Выделить всё
// нахожу dim1
// создаю A размерностью [dim1][3][3]
float ***A = new float**[dim1];
for (int i=0; i<dim1; i++) A[i]=new float*[3];
for (int i=0; i<dim1; i++) for (int j=0; j<3; j++) A[i][j]=new float[3];
// удаляю A размерностью [dim1][3][3]
for (int i=0; i<dim1; i++) for (int j=0; j<3; j++) delete[] A[i][j];
for (int i=0; i<dim1; i++) delete[] A[i];
delete[] A;
// нахожу dim2
// на этом шаге возникает ошибка с редекларацией
// создаю A размерностью [dim2][3][3]
/*float ***A = new float**[dim2];
Примечание: вопрос зачем обявлять одну и ту же переменную два раза? */
A = new float**[dim2];
for (int i=0; i<dim2; i++) A[i]=new float*[3];
for (int i=0; i<dim2; i++) for (int j=0; j<3; j++) A[i][j]=new float[3];
Массив A находится в цикле, поэтому я не могу назвать его как то по другому, например, A2. Массив A должен переопределяться по размерности dim в цикле. Помогите, пожалуйста: как обойти эту проблему?
смотри примечание в коде
Re: Трехмерный динамический массив, С++
Добавлено: 20 авг 2009, 00:56
superregistr
Спасибо. Я разобрался. Ошибка была в том, что я декларировал массив из указателей и приравнивал его. Достаточно было задекларировать вначале и уже потом оперировать с ним дальше, выделять и удалять память под него. Просто на тот момент не совсем представлял, что такое new и delete, думал они создают переменные, а на самом дело только выделяют или освобождают память под уже задекларированные переменные. Сейчас попробую освоить контейнеры из STL, они рекомендуются вместо диманического массива. Какое ваше отношение к STL? На практике удобнее использовать?
Re: Трехмерный динамический массив, С++
Добавлено: 23 окт 2009, 08:37
atavin-ta
" писал(а):Какое ваше отношение к STL?
Зачем мне сэтээл? Я сам могу организовать динамическую память.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
" писал(а):Спасибо. Я разобрался. Ошибка была в том, что я декларировал массив из указателей и приравнивал его. Достаточно было задекларировать вначале и уже потом оперировать с ним дальше, выделять и удалять память под него.
Никогда не ставлю значения в самой декларации, за исключением статических, но при этом локальных данных. Всегда удобнее разделять декларацию и присваивание. Паскаль в этом плане разумнее: там вообще запрещено присваивать и декларировать одновременно.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
" писал(а):Нужно создать трехмерный динамический массив и ввести какие-то значения.
Трёхмерный? Всего то? Я начинал с шестимерных. Динамических и на бейсике.