/*
C言語/C++言語で3次元配列を動的に確保&解放するプログラム
「2次元配列を動的に確保&解放するプログラム」の3次元版です。
*/
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
template<typename T>T***AllocCubic(int u,int v,int w)
{
int i,j; T***a,**b,*c;
try { a=(T***)new char[(sizeof*b*(1+v)+sizeof*c*w*v)*u]; }
catch (...) { a=0; }
if (a) { b=(T**)(a+u); c=(T*)(b+u*v); } else return 0;
for (i=0;i<u;i++,b+=v) for (a[i]=b,j=0;j<v;j++,c+=w) b[j]=c;
return a;
}
#define ALLOC_CUBIC(T,U,V,W) AllocCubic<T>(U,V,W)
#define FREE(X) delete[]X
#else
void*AllocCubic(int s,int u,int v,int w)
{
int i,j,t=s*w; char***a,**b,*c;
a=(char***)malloc(((1+v)*sizeof*a+t*v)*u);
if (a) { b=(char**)(a+u); c=(char*)(b+u*v); } else return 0;
for (i=0;i<u;i++,b+=v) for (a[i]=b,j=0;j<v;j++,c+=t) b[j]=c;
return a;
}
#define ALLOC_CUBIC(T,U,V,W) (T***)AllocCubic(sizeof(T),U,V,W)
#define FREE(X) free(X)
#endif
int main(void)
{
int u=3,v=6,w=16,i,j,k; double***a=ALLOC_CUBIC(double,u,v,w);
for (i=0;i<u;i++) for (j=0;j<v;j++) for (k=0;k<w;k++)
a[i][j][k]=i*256+j*16+k;
for (i=0;i<u;i++) {
for (j=0;j<v;j++) {
for (k=0;k<w;k++) printf("%03X ",(int)a[i][j][k]);
printf("\n");
}
printf("\n");
}
FREE(a); return 0;
}