将三维数组传递给C中的函数的最佳方法是什么?
答案 0 :(得分:5)
要求您在编译时定义除最左侧维度以外的所有维度。
#define DIM 5
void do_something(float array[][DIM][DIM])
{
array[0][0][0] = 0;
...
}
答案 1 :(得分:5)
typedef
是你的朋友。
#include <stdio.h>
typedef int dimension1[20]; /* define dimension1 as array of 20
elements of type int */
typedef dimension1 dimension2[10]; /* define dimension2 as array of 10
elements of type dimension1 */
int foo(dimension2 arr[], size_t siz);
int main(void) {
dimension2 dimension3[7] = {0}; /* declare dimension3 as an array of 7
elements of type dimension2 */
dimension3[4][3][2] = 9999;
dimension3[4][0][12] = 1;
dimension3[3][8][18] = 42;
printf("%d\n", foo(dimension3, 7));
return 0;
}
int foo(dimension2 arr[], size_t siz) {
int d1, d2, d3;
int retval = 0;
for (d3=0; d3<siz; d3++) {
for (d2=0; d2<sizeof *arr / sizeof **arr; d2++) {
for (d1=0; d1<sizeof **arr / sizeof ***arr; d1++) {
retval += arr[d3][d2][d1];
}
}
/* edit: previous answer used definite types for the sizeof argument */
//for (d2=0; d2<sizeof (dimension2) / sizeof (dimension1); d2++) {
// for (d1=0; d1<sizeof (dimension1) / sizeof (int); d1++) {
// retval += arr[d3][d2][d1];
// }
//}
}
return retval;
}
修改的
我不喜欢使用明确的类型作为sizeof
的参数
我添加了获取(子)数组大小而不直接指定其类型的方法,而是让编译器从对象定义中推断出正确的类型。
第二次编辑
由于Per Eckman notes typedefing“裸”阵列可能很危险。请注意,在上面的代码中,我没有将数组本身传递给函数foo
。我正在传递指向“低级”数组的指针。
foo()
,在上面的代码中,接受指向dimension2
类型的对象的指针。 dimension3
对象是dimension2
类型的元素数组,而不是dimension3
类型的对象(甚至没有定义)。
但请记住Per Eckman的说明。
答案 2 :(得分:4)
将它们作为指针传递。
示例
int a[N][M][P];
foo( &a[0][0][0]);
foo在哪里
void foo( int*)
您可能还需要传递尺寸,因此在这种情况下您可能需要:
void foo( int*, int D1, int D2, int D3)
并致电
foo( &a[0][0][0], N, M, P);
答案 3 :(得分:3)
typedefing“bare”数组可能很危险。
试试这个
#include <stdio.h>
typedef char t1[10];
void foo(t1 a) {
t1 b;
printf("%d %d\n", sizeof a, sizeof b);
}
int main(void) {
t1 a;
foo(a);
return 0;
}
可以认为相同类型的两个变量的sizeof将返回相同的大小 但不是在这种情况下。因此,包装typedef-ed数组是一个很好的做法 在结构中。
typedef struct {
char x[10];
} t1;