首先:是的,我知道这是一个常见话题,我已经尝试了几个建议的解决方案。没有什么对我有用(至少没有“好”的代码),我终于尝试了这里描述的方式(jxh解决方案中的第二个变体): 2D array passing to a function
#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;
}
}
我仍然遇到不兼容的类型错误 - 如何修复?
答案 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 :(得分:1)
执行Multiply_Matrix_Vector(3, 8, A[3][8], B[8], Result[3]);
相反,你传递的是A的元素(3,8),即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(...)
答案 2 :(得分:1)
你错过了一些事情,比如)
in。
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的数组。