次のように C で 2D 配列を作成します。
int **arr;
arr = malloc(rows * sizeof(int *));
for (i = 0; i < rows; i++)
arr[i] = malloc(cols * sizeof(int));
今、私は電話します:
func(arr)
関数func
で、行と列の次元を計算するにはどうすればよいですか?
次のように C で 2D 配列を作成します。
int **arr;
arr = malloc(rows * sizeof(int *));
for (i = 0; i < rows; i++)
arr[i] = malloc(cols * sizeof(int));
今、私は電話します:
func(arr)
関数func
で、行と列の次元を計算するにはどうすればよいですか?
あなたはそれを計算することはできません -arr
ポインタへの単なるポインタであり、それに関連する情報はありません (すべての C 配列と同様)。ディメンションを個別の引数として渡す必要があります。
できません。配列とともに次元を関数に渡す必要がありますfunc(arr)
。
できません (C の美しさ)。(sizeof を使用しようとしないでください。ポインタのサイズしか得られないためです) 別の関数が配列の次元を知る必要がある場合は、それらのパラメータ (高さと幅) を引数として渡す必要があります。配列ポインタで。
この回避策は、配列を直接使用せず、代わりに次のような構造体を使用することです。
構造体テーブル{ int ** arr; int行; int列; }
次に、行と列の数を受け取り、割り当てを処理するテーブルのインスタンスを作成する関数を作成できます。
他の皆さんがおっしゃる通り、仕方ありません。ただし、行、列、およびポインターをまとめて含む構造を作成すると便利な場合があります。これにより、次のことが言えます。
typedef struct { int 行; int列; int **データ; } myDataType;
... foo(マイデータ);
void foo(myDataType myData) { for( i = 0; i < myData.rows; i++) {
for( j = 0; j < myData.cols; j++ ) { printf("%d,%d: %d\n ", i, j, myData.data[i][j]); } } }
(構文が少しずれていたら申し訳ありません。Perl、Java、C#、そしてちょっとした Ruby がエルボー スペースを取り合っています。)