【问题标题】:C: passing a 2D array to a functionC:将二维数组传递给函数
【发布时间】:2023-03-31 16:10:01
【问题描述】:

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

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

【问题讨论】:

    标签: c arrays pointers multidimensional-array


    【解决方案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 也成为一个数组数组吗?

    【讨论】:

      【解决方案2】:

      当你做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(...)

      【讨论】:

        【解决方案3】:

        你错过了一些东西,比如) 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]);
        

        在main函数上面使用它。

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

        【讨论】:

          猜你喜欢
          • 2021-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多