C:将2D数组传递给函数

时间:2014-12-04 14:00:37

标签: c arrays pointers multidimensional-array

首先:是的,我知道这是一个常见话题,我已经尝试了几个建议的解决方案。没有什么对我有用(至少没有“好”的代码),我终于尝试了这里描述的方式(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;
  }
}

我仍然遇到不兼容的类型错误 - 如何修复?

3 个答案:

答案 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变量(您正在访问矩阵的元素和向量的元素),而不是必须使用AB

最后,你必须申报。

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

在主要功能之上使用它。

注意:结果应该是一个数组,因为如果将A(3x8)与B(8x1)相乘,结果应该是一个尺寸为3x1的数组。