Я пытаюсь реализовать динамически распределенные непрерывные трехмерные массивы в коде на языке Си.Массивы должны быть смежными, потому что я полагаюсь на вывод netCDF массивов.Теперь я адаптировал решение, опубликованное здесь Stack OverFlow Solution .Это прекрасно работает для динамического выделения массивов и их индексации ... однако, когда netCDF выводит их, возникает смещение, которое масштабируется как 2-й размер индекса (jcount).Вот модифицированная функция:
void*** newarray(int icount, int jcount, int kcount, int type_size)
{
int i,j,k;
void*** iret = (void***)malloc(icount*sizeof(void***)+icount*jcount*sizeof(void**)+icount*jcount*kcount*type_size);
void** jret = (void**)(iret+icount);
char* kret = (char*)(jret+icount*jcount);
for(i=0;i<icount;i++)
{
iret[i] = &jret[i*jcount];
}
for(i=0;i<icount;i++)
{
for(j=0;j<jcount;j++)
{
jret[i*jcount+j] = &kret[i*jcount*kcount*type_size+j*kcount*type_size];
}
}
return iret;
}
Если я правильно понимаю эту функцию, iret выделено место для 3D-указателей, составляющих iret (первый индекс), для 2D-указателей, составляющих jret (2-й индекс) и пространство дляфактические значения, составляющие крет.2D указатель джрета затем связывается с секцией 2D массива iret.Затем то же самое делается для крет.Затем каждый адрес iret указывает на первое значение каждого раздела jret.Затем каждый адрес jret указывает на первый адрес kret.
Для записи все работало нормально с определенными препроцессором значениями для моих массивов.Кроме того, если я использую некоторые операторы printf в коде для проверки числовых значений массивов, все они, по-видимому, правильно индексируют и код выполняется правильно, это просто вывод, который, по-видимому, является результатом несмежного хранения в памяти массивов.
У меня есть структура вида:
typedef struct
{
double ***test;
} STRUCT_TYPE;
, которую я затем выделяю, используя
mhd = (STRUCT_TYPE *) malloc(sizeof(STRUCT_TYPE));
mhd.test = (double***) newarray(101,7,101,sizeof(double));
Это может быть проблема с netCDF ... но я быпросто хочу знать, что моя процедура распределения не проблема.