將三維數組傳遞給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