蛙の井戸見聞記 Pretty frog in a well who knows nothing of the great web ocean!

~~ 好奇心は猫をも殺す Curiosity Kills the Cat ~~ ♪欲しいモノ・食べたいモノ・ネットで集めた情報と日々の記録の倉庫♪ Logging my life... Since 2003.12  

3次元マトリックスの確保 C言語

C言語では、多次元配列は無いとかポインタがどうとか、ややこしいー話がいっぱい。

私がやりたいのは、配列のインデックスを動的にフリーに指定すること。
ちょうど、昔のnumerical recipes in Cに出てくる2次元配列の動的確保を3次元配列でやりたい。。ということであった。
これまた悪戦苦闘。結局下記のプログラムでうまくいった。

#define HUP 1
//***************************************************** 
double ***dmatrix_3d(long row1, long row2, long col1, long col2, long dep1, long dep2){
	long i,j, nrow=row2-row1+1, ncol=col2-col1+1, ndep=dep2-dep1+1;
	double ***m;
	m=(double ***) malloc((size_t)((nrow+HUP)*sizeof(double**)));
	m += HUP;
	m -= row1;
	m[row1]=(double **) malloc((size_t)((ncol*nrow+HUP)*sizeof(double*)));
	m[row1] += HUP;
	m[row1] -= col1;
	for(i=row1+1;i<=row2;i++){
		m[i]=m[i-1]+ncol;
	}
    m[row1][col1]=(double *)malloc((size_t)((ndep*ncol*nrow+HUP)*sizeof(double))); 
	m[row1][col1] += HUP;
	m[row1][col1] -= dep1;
	
	j=col1;
	for(i=row1+1;i<=row2;i++){
		m[i][j]=m[i-1][j]+ncol*ndep;
	}
	for(i=row1;i<=row2;i++){
		for(j=col1+1;j<=col2;j++){
			m[i][j]=m[i][j-1]+ndep;
		}
	}
	return m;
}
//***************************************************** 
void free_3d_matrix(double ***m,long row1, long row2, long col1, long col2, long dep1, long dep2){
	free( (char*)(m[row1][col1]+dep1-HUP) );
	free( (char*)(m[row1]+col1-HUP) );
	free( (char*)(m+row1-HUP) );
}
//***************************************************** 
void main(void){
double ***mat_a;
int i,j,k;

mat_a=d_matrix3d(1,3,1,3,1,3);

for(i=1;i<=3;i++){
for(j=1;j<=3;j++){
for(k=1;k<=3;k++){
mat_a[i][j][k]=(double)(i+j+k);
}
}
}
for(i=1;i<=3;i++){
for(j=1;j<=3;j++){
for(k=1;k<=3;k++){
printf("%f\t", mat_a[i][j][k];
}
printf("\n");
}
printf("\n");
}

free_3d_matrix(mat_a,1,3,1,3,1,3);