在 C 中添加二维矩阵

Add 2D matrices in C

我正在尝试添加两个 2D 矩阵,我猜我在使用指针时遇到了一些问题。算法本身显然没有问题,但我想把它作为一个 return 函数,到目前为止我找到的所有解决方案都没有这样做。这是我现在的代码,它在函数调用时失败:

    #include <stdio.h>

float **addMatrix(float **m1, float **m2, int x, int y){
    float m3[x][y];
    int i, j;
    for (i=0;i<x;i++){
        for (j=0;j<y;j++){
            m3[i][j]=m1[i][j]+m2[i][j];
        }
    }
    return m3;  
}

int main(){
    int x=3,y=3;
    float m1[x][y], m2[x][y];
    float **m3 = addMatrix(m1, m2, x, y);
    return 0;
}

Warnings: 
    In function 'addMatrix':
    [Warning] return from incompatible pointer type
    [Warning] function returns address of local variable [-Wreturn-local-addr]
    In function 'main':
    [Warning] passing argument 1 of 'addMatrix' from incompatible pointer type
    [Note] expected 'float **' but argument is of type 'float (*)[(sizetype)(y)]'
    [Warning] passing argument 2 of 'addMatrix' from incompatible pointer type
    [Note] expected 'float **' but argument is of type 'float (*)[(sizetype)(y)]'

首先,值数组(例如int m1[3][3])不等同于指向type int(例如int **m1;)的指针数组。

接下来,当将数组传递给函数(而不是指向类型的指针数组)时,您必须传递除行数之外的每个维度。 (第一个)。因此,在您的情况下,您可以全部传递 addMatrix (float m1[3][3]...),或者传递列数 addMatrix (float m1[][3]...))

在尝试在 C 中添加任何内容之前,您必须初始化或设置要添加的内容的值。当您将 m1m2 传递给 addMatrix 时,它们是未初始化的。 (它就像一盒巧克力)。在调用 addMatrix.

之前初始化并设置 m1m2 的值

您不能 return 在函数内本地创建的数组,除非您 return 将 指针指向动态分配的内存块 。 C 中的所有 return 都是单个值(可以是指向更复杂的东西的单个指针)这里你的 return type for addMatrix 是错误的。您需要将 m3 传递给 addMatrix 以保存加法的结果。因此,return 也可能是 void(或其他表示 success/failure 的单个值)。例如:

void addMatrix (float m3[][3], float m1[][3], float m2[][3], int x)

最后,我知道我可能忘记了一些东西,除非您尝试使用可变长度数组,否则您对数组的声明必须使用常量值,而不是变量。最简单的方法是在代码开头为维度创建一个 #define,并且可以方便地更改整个代码中的值。

将所有这些放在一起,您可以执行以下操作:

#include <stdio.h>

#define DIMXY 3

void addMatrix (float m3[][DIMXY], float m1[][DIMXY], float m2[][DIMXY], int x)
{
    int i, j;

    for (i = 0; i < x; i++) {
        for (j = 0; j < DIMXY; j++) {
            m3[i][j] = m1[i][j] + m2[i][j];
        }
    }
}

int main ()
{
    int i, j, x = 3;
    float m1[DIMXY][DIMXY] = {{0}};  /* always initialize arrays to zero */
    float m2[DIMXY][DIMXY] = {{0}};
    float m3[DIMXY][DIMXY] = {{0}};

    /* now fill m1 & m2 -- otherwise "what are you adding?" */
    for (i = 0; i < x; i++)
        for (j = 0; j < DIMXY; j++) {
            m1[i][j] = i + j + 1;
            m2[i][j] = m1[i][j] + 4;
        }

    addMatrix (m3, m1, m2, x);

    printf ("\n Printing m1\n\n");
    for (i = 0; i < x; i++) {
        for (j = 0; j < DIMXY; j++)
            printf ( "  %4.1f", m1[i][j]);
        putchar ('\n');
    }

    printf ("\n Printing m2\n\n");
    for (i = 0; i < x; i++) {
        for (j = 0; j < DIMXY; j++)
            printf ( "  %4.1f", m2[i][j]);
        putchar ('\n');
    }

    printf ("\n Printing m3 after addMatrix\n\n");
    for (i = 0; i < x; i++) {
        for (j = 0; j < DIMXY; j++)
            printf ( "  %4.1f", m3[i][j]);
        putchar ('\n');
    }


    return 0;
}

输出

$ ./bin/arr_add_2d

 Printing m1

   1.0   2.0   3.0
   2.0   3.0   4.0
   3.0   4.0   5.0

 Printing m2

   5.0   6.0   7.0
   6.0   7.0   8.0
   7.0   8.0   9.0

 Printing m3 after addMatrix

   6.0   8.0  10.0
   8.0  10.0  12.0
  10.0  12.0  14.0

如果您碰巧打算使用 可变长度数组,那么您的代码将如下所示:

void addMatrix (float m3[][3], float m1[][3], float m2[][3], int x, int y)
{
    int i, j;

    for (i = 0; i < x; i++) {
        for (j = 0; j < y; j++) {
            m3[i][j] = m1[i][j] + m2[i][j];
        }
    }
}

int main ()
{
    int i, j, x = 3, y = 3;
    float m1[x][y];  /* cannot initialize variable size objects */
    float m2[x][y];
    float m3[x][y];

    /* now fill m1 & m2 -- otherwise "what are you adding?" */
    for (i = 0; i < x; i++)
        for (j = 0; j < y; j++) {
            m1[i][j] = i + j + 1;
            m2[i][j] = m1[i][j] + 4;
        }

    addMatrix (m3, m1, m2, x, y);