将三维数组传递给C函数的最佳方法是什么?将三维数组传递给C中的函数?
2
A
回答
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的typedef-ING “裸” 阵列可能是危险的。请注意,在上面的代码中,我没有将数组本身传递给函数foo
。我传递一个指向“较低级别”数组的指针。
foo()
在上面的代码中接受指向dimension2
类型的对象的指针。 dimension3
对象是dimension2
类型的元素的数组,,而不是dimension3
类型的对象(甚至未定义)。
但请记住Per Eckman的笔记。
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);
5
您需要在编译时定义最左侧的所有维度。
#define DIM 5
void do_something(float array[][DIM][DIM])
{
array[0][0][0] = 0;
...
}
3
typedef -ing“bare”arrays are dangerous。
试试这个
#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;
+0
+1非常好的提醒 – pmg 2009-11-17 15:06:34
相关问题
- 1. C - 将一个三维字符数组传递给函数
- 2. 将多维数组传递给函数
- 3. 将多维数组传递给函数?
- 4. 将多维数组传递给函数
- 5. 将非动态2维数组传递给C中的函数?
- 6. C++将值传递给函数中的二维字符数组
- 7. 将二维数组传递给C中的函数
- 8. 将二维数组传递给只有一维数组的函数(C++)
- 9. C - 将二维数组上的指针传递给函数
- 10. C++将2d数组传递给函数
- 11. 将[out]数组传递给C++函数
- 12. 将数组传递给函数C
- 13. C++将char数组传递给函数
- 14. 将数组传递给函数c
- 15. 将数组传递给函数c
- 16. 将多维数组传递给函数C
- 17. 如何将二维数组传递给函数在c + +
- 18. 将多维数组传递给函数(C++)?
- 19. 将两个二维数组传递给一个函数C++
- 20. 将多维数组传递给函数C
- 21. 将多维数组传递给函数C
- 22. 修改二维字符数组传递给C中的函数
- 23. PostgreSQL中的聚合函数将数组传递给C函数
- 24. 如何将二维数组传递给F#中的函数?
- 25. 将二维数组传递给Rust中的函数
- 26. 如何将C#中的二维数组传递给C++?
- 27. 将二维数组传递到函数
- 28. 将二维数组传递到函数
- 29. 如何将特定值从二维数组传递给C++中的函数?
- 30. 将2维数组传递给函数的正确方法
是在[0] [0] [0]有必要吗? – 2009-11-17 12:37:31
@Cory,是的,它首先得到第一个int,并将其作为地址。这就给出了结果表达式类型'int *',而不是象'int(*)[N] [M] [P]'这样的数组指针。在我看来,这是一个很好的黑客攻击手段,它可以通过不必处理任何地方的常量来提高程序的清晰度。但它正式不能保证工作,所以小心使用它(不确定会出现什么问题)。 – 2009-11-17 12:43:18
@Cory,其他的写法是'&*** a','a [0] [0]'和'** a'。 – 2009-11-17 12:51:37