Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > трёхмерный динамический массив


Автор: Andrey44 8.7.2007, 15:02
Код


int    ***intdataArray3D = NULL;

intdataArray3D = new int**[d1];
for(int i = 0; i < d1; i++){
    intdataArray3D[i] = new int*[d2];
    for(int j = 0; j < d2; j++)
        intdataArray3D[i][j] = new int[d3];
}

if(intdataArray3D!=NULL){
    for(int i = 0; i < d1; i++){
        for(int j = 0; j < d2; j++)
            delete [] intdataArray3D[i][j];
        delete [] intdataArray3D[i];
    }
    delete [] intdataArray3D;
}


Всем добрый день.

Подскажите пожалуйста правильно ли я создаю трёхмерный массив, а патом освобождаю память.

Автор: archimed7592 8.7.2007, 15:06
Правильно.

Автор: Andrey44 8.7.2007, 16:05
Тогда подскажите как передать в функцию этот трёхмерный массив.

Есть функция:
Код

int intdataArray3D[5][5][5];

H5Dread(dataset, H5T_NATIVE_INT, memspace, dataspace, H5P_DEFAULT, (void*)intdataArray3D);

отрабатывает нормально и я получаю в массив данные.

Но если динамический массив:
Код

nt ***intdataArray3D;

for(int i = 0; i < d1; i++){
    intdataArray3D[i] = new int*[d2];
    for(int j = 0; j < d2; j++)
        intdataArray3D[i][j] = new int[d3];
}

H5Dread(dataset, H5T_NATIVE_INT, memspace, dataspace, H5P_DEFAULT, intdataArray3D);


Программа слетает с ошибкой. smile 

Автор: archimed7592 8.7.2007, 16:12
Кхм... не вижу прототипа H5Dread... а мысли читать пока не научился...

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

Код

int n = 100;
int (*arr)[5][5] = new int [n][5][5];

// динамической может быть только первая размерность. Остальные должны быть статическими.


Добавлено через 1 минуту и 5 секунд
Да, и чему у тебя равны d1, d2, d3?

Автор: Andrey44 8.7.2007, 16:23
H5Dread это функция из библиотеки для работы с файлами формата HDF5 smile 

d1, d2, d3 - это я из файла получаю размерность массива так-что заранее я не знаю
размеры массива. smile 

Автор: archimed7592 8.7.2007, 18:38
Цитата(Andrey44 @  8.7.2007,  16:23 Найти цитируемый пост)
H5Dread это функция из библиотеки для работы с файлами формата HDF5 smile 

А ты не будешь так любезен и не приведёшь здесь прототип этой ф-ции или ссылку на её документацию?
Если конечно хочешь, чтобы тебе помогли...

Автор: Andrey44 8.7.2007, 19:09
Ссылка на описание функции.

http://hdf.ncsa.uiuc.edu/HDF5/doc/RM_H5D.html#Dataset-Read

Там много интересного. smile 

Автор: archimed7592 8.7.2007, 19:31
Ей нужен буфер.
Выделять так:
Код

int *arr = new int [d1 * d2 * d3];

Использовать этот массив можно потом так:
Код

int &get_item(int *arr, int i1, int i2, int i3)
{
    return arr[i1 * d2 * d3 + i2 * d3 + i3];
}

Или можно написать обёртку, которая будет себя вести подобно такому массиву.

Автор: Andrey44 8.7.2007, 19:37
Спасибо сейчас попробую. smile 

Но почему всё работает с нединамическим трёхмерным массивом?

Автор: bsa 8.7.2007, 19:40
Цитата(Andrey44 @ 8.7.2007,  19:37)
Спасибо сейчас попробую. smile 

Но почему всё работает с нединамическим трёхмерным массивом?

Потому что организация памяти (структура массива) другая.

Автор: Andrey44 8.7.2007, 19:55
Спасибо, archimed7592 вроде-бы всё работает. smile 

Получается, что трёхмерный динамический там и не нужен. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)