2014-12-04 99 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的数组。