Использование указателя для многоадресной матрицы

У меня есть указатель на 4-мерный массив; и я хочу использовать его для назначения значений 4-мерному массиву.

Я знаю, что нужно создать 4-мерный массив и пройти через него с помощью указателя на float

float dArray [2][3][4][5];
float *ptr = &dArray[0][0][0][0];

То, с чем я борюсь, - это если у меня есть указатель на 4-мерный массив

float ***pointerArray4D[];

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

value = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
 for (int ix1 = 0; ix1 < DIM1; ++ix1)
 for (int ix2 = 0; ix2 < DIM2; ++ix2)
 for (int ix3 = 0; ix3 < DIM3; ++ix3)
 pointerArray4D[ix0][ix1][ix2][ix3] = float(value++);

То, что я пытался сделать, это

1)

float pointerArray4D_1[2][3][4][5];
float ***pointerArray4D[5];
pointerArray4D = pointerArray4D_1;

2) Другое, что я думаю, что я должен делать, это присвоить ему память

pointerArray4D=new float*[2]; 
for(int i=0; i<2; ++i)
 pointerArray4D[i]=new float*[3];
for(int i=0; i<3; ++i)
 pointerArray4D[i]=new float*[4];
for(int i=0; i<4; ++i)
 pointerArray4D[i]=new float[5];

ошибка: ожидаемый конструктор, деструктор или преобразование типа до '= токена

Излишне говорить, что новая пчела изучает искусство :)

Отредактировано - опечатка использования ****** для представления идеи, что я могу пройти

2 ответа

Прежде всего, следуя подсказке user3353819:

подумайте о ****** array[a][b][c][d] как просто массив удвоений длины a * b * c * d. Это означает, что вы найдете первый элемент с &array который имеет тип *******

Глядя на ваш код:

float ***pointerArray4D[];
value = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
 for (int ix1 = 0; ix1 < DIM1; ++ix1)
 for (int ix2 = 0; ix2 < DIM2; ++ix2)
 for (int ix3 = 0; ix3 < DIM3; ++ix3)
 pointerArray4D[ix0][ix1][ix2][ix3] = float(value++);

правильный способ сделать это:

float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
 for (int ix1 = 0; ix1 < DIM1; ++ix1)
 for (int ix2 = 0; ix2 < DIM2; ++ix2)
 for (int ix3 = 0; ix3 < DIM3; ++ix3)
 pointerArray[ ix0*DIM1*DIM2*DIM3 + ix1*DIM2*DIM3 + ix2*DIM3 + ix3 ] = fValue++;

Ключ состоит в том, что массив, имеющий размерность [DIM0] [DIM1] [DIM2] [DIM3], является пространством contiguos в памяти, в котором "DIM0 раз содержит блок, содержащий" "DIM1 раз, блок, содержащий" "DIM2, раз блок, содержащий" "DIM3 раз поплавок"

В качестве примера следующий код дает тот же результат:

float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
for (int ix0 = 0; ix0 < DIM0; ++ix0)
 for (int ix1 = 0; ix1 < DIM1; ++ix1)
 for (int ix2 = 0; ix2 < DIM2; ++ix2)
 for (int ix3 = 0; ix3 < DIM3; ++ix3)
 *pointerArray++ = fValue++;

или даже лучше:

float fArray[DIM0][DIM1][DIM2][DIM3];
float *pointerArray = &fArray[0][0][0][0];
float fValue = 0;
const int nElem = DIM0*DIM1*DIM2*DIM3;
for (int ix = nElem; ix>0; --ix)
 *pointerArray++ = fValue++;

Надеясь, что этот ответ вы зададите, спокойной ночи, Стефано


Эта...

****** dArray [2][3][4][5];

... объявляет массив. Существует хранилище для 2 * 3 * 4 * 5 ****** связанных с ним.

Эта...

float ***pointerArray4D[];

... объявляет массив неопределенной длины float ***, где он фактически легален вообще (то есть в области файлов). Это фактически то же самое, что и float ****. Нет никакого связанного хранилища для любого фактического float до тех пор, пока вы не выделите некоторые. Более того, пространство, которое вы выделили для pointerArray4D должно было содержать значения типа float *** (за его объявление). Вы можете работать с этим, но вам придется выполнять четыре уровня распределения.

Предполагая, что DIM0 - DIM3 будут макросами препроцессора, возможно, вам понадобится нечто подобное:

float (*pointerArray4D)[DIM1][DIM2][DIM3];

pointerArray4D = malloc(DIM0 * sizeof(*pointerArray4D));

... после чего вы можете обрабатывать pointerArray4D точно так же, как и dArray. (Но не забудьте free(pointerArray4D) когда вы закончите с ним.)

licensed under cc by-sa 3.0 with attribution.