这是一种方法:将数据值分配为一个块,然后将所有行(int *)
作为一个块,然后将 的行(int **)
作为一个块,等等。
a) 将所有数据值分配为一个块。如果nDim
数组中有维度elementsPerDim
,则有prod = product(elementsPerDim, nDim)
数据值(您可以轻松计算),因此您需要分配:
int prod = product(elementsPerDim, nDim);
int * intblock = calloc(prod, sizeof(int));
b) 分配所有(int*)
. 它们的数量等于除最后一个维度之外的所有维度的乘积,因此您可以简单地product()
使用 length 调用您的函数nDim-1
。所以有product(elementsPerDim, nDim-1)
这样的值,每个 size sizeof (int*)
。让我们分配它们:
int npointers = product(elementsPerDim, nDim-1);
int ** ptrblock = calloc(npointers, sizeof (int *));
现在您必须初始化它们以指向上一步中的块。每个指针都有一个不重叠的elementsPerDim[nDim-2]
整数块,如下所示:
int rowlength = elementsPerDim[nDim-2];
for (int i=0; i < npointers; i++)
ptrblock[i] = & intblock[i * rowlength]; /* a.k.a. intblock + i*rowlength */
c) 向后迭代步骤 b,直到用完尺寸。即,使用此循环执行步骤 (b):
void ** prev_block = (void **) ptrblock;
void ** curblock;
for (int d = nDim-2; d > 0; d--) {
int npointers = product(elementsPerDim, d);
curblock = calloc(npointers, sizeof (void **));
int rowlength = elementsPerDim[d-1];
for (int i=0; i < npointers; i++)
curblock[i] = & prev_block[i * rowlength];
prev_block = curblock; /* get ready for the next round */
}
完成后,curblock
将是一个指针数组,指向二级指针块,依此类推,直到整数块。您可以使用普通数组表示法来取消引用它们:
ptrblock[3][2][15]
等。
我可能在某处得到了一个索引,但这应该是算法。您会注意到这是在 C 中,并且使用void **
而不是堆叠取消引用的数量。您确实说过您对算法感兴趣,而不是对高尔夫类型感兴趣......(只要所有指针在您的机器上具有相同的大小,它就应该工作。)