3

C では、次の 3 次元のような n 次元配列を宣言したいと考えています。

printf("please insert n1, n2, n3\n");
scanf("%d %d %d", &n1, &n2, &n3);

int ***nda;
nda = (int ***)malloc(n1*sizeof(int **));

for (i = 0; i < n1; i++) {
    nda[i] = malloc(n2*sizeof(int *));
    for (j = 0; j < n2; j++) {
        nda[i][j] = malloc(n3*sizeof(int));
    }
}

マクロを使用してこのプロセスを自動化し、n-dim に展開したいのですが、次のようなポインターを宣言する必要があることがわかりました。

type *...*(n times)typename;  

マクロはこれを行うための一見可能な方法だと思いますが、ここで回答を検索した後、マクロは再帰的に展開されないことがわかりました。
Cでこれを行うための回避策はありますか?

4

3 に答える 3

3

あなたが今していることをやめなさい!ポインター間接化の各レベルは、プログラムに重大なパフォーマンス ヒットを追加します。そこで作成しているのは多次元配列ではなく、n-ary ツリーであり、各配列要素は多数の分岐へのポインターであり、それが再び広がります。

n 次元データの配列を作成する場合は、次のようにします。

size_t dim[...]

int *nda;
nda = malloc(sizeof(int) * dim[0] * dim[1] * … * dim[n]);

配列内の要素をアドレス指定するには、これを使用します

nda[ dim[0]*(i[1] + dim[1]*(i[2] + dim[…]*(i[…+1])) + i[0] ];
于 2014-09-04T21:59:03.983 に答える