在C

时间:2015-10-18 17:19:29

标签: c arrays matrix return addition

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

    #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)]'

1 个答案:

答案 0 :(得分:2)

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

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

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

除非您将指针返回到动态分配的内存块,否则无法返回在函数内本地创建的数组。 C中的所有返回值都是单个值(可以指向更复杂的单个指针)。return type addMatrix的错误。您需要将m3传递给addMatrix才能保留添加结果。因此,返回也可以是void(或表示成功/失败的其他单个值)。 e.g:

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] = enter image description here;  /* always initialize arrays to zero */
    float m2[DIMXY][DIMXY] = enter image description here;
    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);