【发布时间】:2018-07-10 02:11:25
【问题描述】:
我想编写一个函数,它接受一个包含 'n' 个元素的 'm' 个维度的数组,以及一个指向 other-trivial-function 的指针。该函数将在每个维度上调用自身,遍历其元素并在每次提到的指针指向的函数时调用(微不足道的)。 问题是我找不到一种方法来定义一个函数足够通用 来接受任何维度的数组,或者一个指向任何维度数组的指针。基本上是因为每次函数调用自己时都会摆脱一维,这与函数原型和定义不兼容。 我编写了一个函数,它接受一个单维指针,并根据其他两个参数(即元素的总数和每个维度的大小)将其威胁为多维。
int main(int argc, char **argv)
{
void goesThrough (int *, int *, size_t, void (*) (int));
void print (int);
int array[] = {1, 2, 3, 4, 5, 6};
int (* ptrToArray) = array;
/*
* Arguments are a pointer to an array, an array of sizes for each
* dimension, the amount of elements, and a pointer to whatever
* function.
*/
goesThrough (ptrToArray, (int []) {2, 3}, 6, print);
return 0;
}
void goesThrough (int * anArray, int * dimSize, size_t quantity,
void (* aFunction) (int))
{
size_t index;
for (index = 0; index < (* dimSize); ++index)
{
if (quantity / (* dimSize) > 1)
{
goesThrough (anArray + (index * (quantity /(*dimSize))),
dimSize + 1, quantity / (* dimSize), aFunction);
}
else
{
aFunction (anArray[index]);
}
}
}
void print (int aValue)
{
printf ("%d ", aValue);
}
但是,我发现这种方法有两个缺点。感觉就像 如果出现问题,编译器将无济于事;并且要读取/写入这些 数组 中的单个成员,我也需要编写自己的函数。
问题1:如何使用多维数组来写这个?
问题2:在这种情况下,递归是否比循环更好?如果没有,我会很感激一个使用循环的例子,(无论如何我都会这样做);)。为了更好,我的意思是认真的程序员会选择它的任何原因。
编辑:我最初要求数组/指针(Q1),但我的意思是 数组/指向数组的指针
注意:请注意,这里的问题是传递与函数期望的维数不同的维数数组。在这方面,非常欢迎对标题进行编辑或提出建议。
【问题讨论】:
-
void goesThrough(void *p, ...)将接受p的任何对象指针。 -
@chux - 是的,但这就像砌砖砌房子一样。我不想编写自己的多维数组实现,我宁愿使用已经存在的那个。正如我上面所说,访问这些数组的单个成员需要一个新函数。
标签: c pointers recursion multidimensional-array