0

次の C 関数を使用して 4D 配列をエミュレートしています。追加のループを追加する以外に、この関数を n 次元配列を作成するのに十分な汎用にする良い方法はありますか?

double ****alloc_4D_data(int wlen, int xlen, int ylen, int zlen)
{
    int i,j,k;

    double ****ary = (jdouble****)malloc(wlen*sizeof(jdouble***));

    for (i = 0; i < wlen; i++) 
    {
        ary[i] = (jdouble***)malloc(xlen*sizeof(jdouble**));

        for (j = 0; j < xlen; j++) 
        {
            ary[i][j] = (jdouble**)malloc(ylen*sizeof(jdouble*));

            for (k = 0; k < ylen; k++) 
            {
                ary[i][j][k] = (jdouble*)malloc(zlen*sizeof(jdouble));
            }
        }
    }

    return ary;
}
4

2 に答える 2

2

C言語では、多次元配列のすべての要素が連続したメモリ領域に格納されます。したがって、すべての N 次元の要素の総数を計算し、メモリ全体を malloc するだけです。そのような:

/* int *Nlen is a N length array to store every dimensional array length
 * int N is the Nlen array length indicates how many dimensions.
 */
double *alloc_ND_data(int wlen, int *Nlen, int N)
{
    int i;
    int total = 1;
    double *array;

    for(i = 0; i < N; i ++) {
    /* Every dimension should mul the next depth dimension size */ 
        total *= Nlen[i]; 
    }
    array = malloc(wlen*total*sizeof(jdouble));

    return array;
}
于 2013-09-15T17:11:58.540 に答える
0

この方法で作成した配列は、非常に明白な再帰構造を持っています。つまり、i 番目のレベルのメモリは、(i-1) 番目のレベルのメモリへのポインタの配列にすぎません。0 番目のレベルのメモリのみに、ポインタではなく実際のオブジェクトが含まれます。そのため、別の整数配列でサイズを渡すことで、簡単に実装できます。

この場合の再帰は末尾再帰になります。つまり、純粋に循環的な実装に簡単に置き換えることができます (中間の LIFO ストレージは必要ありません)。しかし、私には、再帰がうまく機能し、読みやすくなるケースの 1 つに見えます。

于 2013-09-15T17:26:11.687 に答える