2014-12-04 139 views
-1

首先:是的,我知道這是一個共同的話題,我已經嘗試了幾種提出的解決方案。沒有什麼工作對我來說(與「好」的代碼至少沒有),我終於嘗試這裏描述的(第二變體JXH的解決方案)的方式: 2D array passing to a functionC:傳遞一個二維數組到一個函數

#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; 
    } 
} 

我仍然獲得不兼容的類型的錯誤 - 這怎麼可能固定?

回答

1

當傳遞給函數的數組衰減爲指針時,真正傳遞的是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是一個數組的數組嗎?

1

當你做Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3]);

相反,你是一個合格的元素在(3,8)你不經過陣列,B.

的第九元素

您的電話應該是以下: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(...)

1

您在錯過了幾件事情,就像)

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變量(你accesing到矩陣的元素和向量的元素),而不是說你必須使用AB

最後,你必須申報。

void Multiply_Matrix_Vector(int n, int m, real32 A[n][m], real32 B[m], real32 Result[n]); 

上面的主要功能在那裏使用它。

注意:結果應該是一個數組,因爲如果乘以A(3x8)和B(8x1),結果應該是一個尺寸爲3x1的數組。