Страница 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
&quot писал(а):Какое ваше отношение к STL?
Зачем мне сэтээл? Я сам могу организовать динамическую память.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):Спасибо. Я разобрался. Ошибка была в том, что я декларировал массив из указателей и приравнивал его. Достаточно было задекларировать вначале и уже потом оперировать с ним дальше, выделять и удалять память под него.
Никогда не ставлю значения в самой декларации, за исключением статических, но при этом локальных данных. Всегда удобнее разделять декларацию и присваивание. Паскаль в этом плане разумнее: там вообще запрещено присваивать и декларировать одновременно.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):Нужно создать трехмерный динамический массив и ввести какие-то значения.
Трёхмерный? Всего то? Я начинал с шестимерных. Динамических и на бейсике.