動的に割り当てられた連続した3D配列をCコードで実装しようとしています。配列のnetCDF出力に依存しているため、配列は連続している必要があります。ここで、StackOverFlowSolutionに投稿されたソリューションを採用しました。これは、配列を動的に割り当ててインデックスを作成する場合に問題なく機能します...ただし、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には、iretを構成する3Dポインター(最初のインデックス)、jretを構成する2Dポインター(2番目のインデックス)、およびkretを構成する実際の値用のスペースが割り当てられます。次に、2D jretポインターは、iretの2D配列セクションに関連付けられます。次に、kretについても同じことが行われます。次に、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の問題かもしれません...しかし、私の割り当てルーチンが問題ではないことを知りたいだけです。