[英]C: passing a 2D array to a function
首先:是的,我知道這是一個常見的話題,我已經嘗試了幾種建議的解決方案。 對我沒有任何幫助(至少對於“ nice”代碼沒有幫助),我終於嘗試了這里描述的方法(jxh解決方案中的第二個變體): 2D數組傳遞給函數
#include<stdio.h>
typedef double real32;
void Multiply_Matrix_Vector38(int n, int m, real32 A[n][m], real32 B[m], real32 Result[n]);
int main()
{
real32 A[3][8];
real32 B[8];
real32 Result[3][3];
int i;
for(i = 0; i < 8; i++) {
A[0][i] = i;
A[1][i] = i+1;
A[2][i] = i+2;
B[i] = i;
B[i] = i;
B[i] = i;
}
Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3]);
return 0;
}
void Multiply_Matrix_Vector(int n, int m, real32 A[n][m], real32 B[m], real32 Result[n])
{
uint8 i, j;
real32 sum;
sum = 0;
for(i = 0; i < n; i++ {
for(j = 0; j < m; j++) {
sum = sum + A[i][j] * B[j];
printf("A %f\n", A[i][j]);
}
Result[i] = sum;
sum = 0;
}
}
我仍然會遇到不兼容的類型錯誤-如何解決?
隨着數組在傳遞給函數時衰減到指針,真正傳遞的是real32 (*)[8]
和real32 *
。
您可以適當地修改函數:
void Multiply_Matrix_Vector38(int n, int m, real32 (*A)[m], real32 *B, real32 *Result);
您還會使用錯誤的參數調用該函數。 您在數組中使用單個值而不是數組本身來調用它。 並記住數組索引從零到大小減一,您也超出了范圍。
而是只做
Multiply_Matrix_Vector(3, 8, A, B, Result);
哦,您是否真的希望Result
也成為數組的數組?
當您執行Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3]);
時,您沒有傳遞數組Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3]);
相反,您正在(3,8)傳遞A的元素,B的第9個元素。
您的調用應為: Multiply_Matrix_Vector(3, 8, A, B, Result[0]);
該錯誤應該可以幫助您:您正在傳遞雙打而不是雙打數組。
結果是大小為3的3個數組的n個數組,因此Result[0]
, Result[1]
和Result[2]
具有正確的類型。 Result[3]
超出范圍。
最后,您的函數原型應該為void Multiply_Matrix_Vector(...)
而不是void Multiply_Matrix_Vector38(...)
您錯過了幾件事,例如)
。
for(j = 0; j < m; j++)
你也應該打電話
Multiply_Matrix_Vector(3, 8, A, B, Result[3])
代替。
Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3])
因為您的參數A[3][8]
和B[8]
是real32變量(您要訪問矩陣的元素和向量的元素),所以不必使用A
和B
最后,您必須聲明。
void Multiply_Matrix_Vector(int n, int m, real32 A[n][m], real32 B[m], real32 Result[n]);
在主要功能上方可以在那里使用它。
注意:結果應為數組,因為如果將A(3x8)與B(8x1)相乘,則結果應為尺寸為3x1的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.