我正在尝试将三维数组传递给这样的函数:
void example( double*** bar ) {
// Stuff
}
int main() {
double[3][2][3] foo;
// Initialize foo
example( foo );
return 0;
}
这会导致gcc给我“无效的指针类型”。我该怎么做呢?我可以让整个参数成为一维数组并安排我的数据以适应它,但是有更优雅的解决方案吗?
编辑:
另外,我不能总是指定每个子阵列的长度,因为它们的大小可能不同。 e.g:
int* foo[] = { { 3, 2, 1 }, { 2, 1 }, { 1 } };
如果它有帮助,我正试图在神经网络中批量传递神经元的输入。每个神经元都有不同数量的输入。
答案 0 :(得分:3)
只需使用double*
即可。多维数组连续存储在内存中,因此非常欢迎您自己动手。这就是在OpenGL上传递位图的方式。
答案 1 :(得分:2)
一维int
数组在传递给函数时会衰减为int
指针。多维数组衰减成指向下一个最低维度的数组的指针,即
void example(double (*bar)[2][3]);
这种语法有点令人费解,因此您可能会选择等效的语法:
void example(double bar[][2][3]) {
// Stuff
}
int main() {
double foo[3][2][3];
example(foo);
return 0;
}
不必给出第一个维度,它是"衰变"的那个部分。 (请注意,数组的维度不是像Java那样在类型上给出,而是在数组名称上。)
只要在数组之前传递维度,此语法也适用于可变长度数组(VLA):
void example(int x, int y, double (*bar)[x][y]) {
// Stuff
}
int main() {
double foo[3][2][3];
example(2, 3, foo);
return 0;
}
此功能需要C99且与C ++不兼容。
答案 2 :(得分:1)
如果数组大小已修复,您可以使用:
void example(double bar[][2][3]) {
}
否则,您可以将大小与数组一起传递给函数:
void example(size_t x, size_t y, size_t z, double bar[x][y][z]) {
}
答案 3 :(得分:0)
That can't be done in C the way you're thinking of. If you need a function that operates on variable-size multidimensional arrays, you'll either have to pass the sizes (all but one) explicitly to the function, or make a structure and pass that. I generally always make a structure when a 2D or 3D array is called for, even if they're of fixed size. I think it's just cleaner that way, since the structure documents itself.