- ベストアンサー
関数宣言
3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ちなみに、作成した配列を C[x][y][z]とアクセスするなら、Cはx個の配列、C[n]はy個の配列、C[n][m]はz個の配列になり、forでまわす事でx*y回、z個のdoubleの配列をmallocします。開放は逆の手順です。 double ***f3Malloc(int x, int y, int z) { double ***C; int i, j; C = (double ***)malloc(sizeof(double **) * x); for (i = 0; i < x; i++) { C[i] = (double **)malloc(sizeof(double *) * y); for (j = 0; j < y; j++) { C[i][j] = (double *)malloc(sizeof(double) * z); } } return C; } int main() { double ***C = f3Malloc(2, 3, 4); ... f3Free(C, 2, 3, 4); return 0; }
その他の回答 (1)
- run34ricky
- ベストアンサー率64% (38/59)
こんにちは。 不慣れだと思いますが、文法的に誤りが多いため、改修点を2点に絞ります。 その1: C/C++で、関数は、 戻り型 関数名([引数1の型 引数1の名前[, 引数2の型 引数2の名前....]]) { /* 関数の処理 */ /* 戻り型で「void」としていなければ、 */ return 返すべき値; } となります。 まず、この文法は守らなければなりません。たとえ、doubleのような基本の型でも、『【doubleへのポインタ】へのポインタ』へのポインタ」でもです。 その2: その上で、使用する関数は、実装はともかく使用する前に宣言だけはしなければなりません。 上の例を再利用すると、 戻り型 関数名([引数1の型 引数1の名前[, 引数2の型 引数2の名前....]]); /* (1) */ int main() { メイン関数の内容 戻り型をintで宣言しているので、 return int値;を忘れずに } 戻り型 関数名([引数1の型 引数1の名前[, 引数2の型 引数2の名前....]]) /* (2) */ { /* 関数の処理 */ /* 戻り型で「void」としていなければ、 */ return 返すべき値; } (1)と(2)は、ほぼ同じ内容です。違いは、")"の後に、セミコロン(;)であるか、括弧({)が続いて関数実装があるかです。 まず、これら2点の観点から、改修してみてください。改修する方向がわからなければ、改修したけどさらにエラーで苦しむようであれば、補足をお願いいたします。
お礼
そうですね。まず、関数を宣言しなければいけなかったですね。ありがとうございました。
お礼
なるほど、そういうアクセス方法があるのですね。大変参考になりました。その方法を参考にさせていただきました。ありがとうございました。