用于添加矩阵的 C 函数

标签 c matrix

我是编码新手,目前正在学校学习 C。我有一个关于如何使用函数在 C 中添加矩阵的问题。我面临一些困难,希望能在这里得到一些建议。我的讲师在类里面给出的条件是 1) 两个 5 x 6 矩阵,其中的整数项为 1 - 100,2) 定义并使用您自己的函数。这是我到目前为止编写的代码:

#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COLUMN 6

size_t addMatrices(int a[][COLUMN], int b[][COLUMN]);
void printArray(int a[][COLUMN]);

int main(void) {
    int row, column;
    int matrix1[ROW][COLUMN] = { {0}, {0} };
    int matrix2[ROW][COLUMN] = { {0}, {0} }; 

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            matrix1[row][column] = 1 + (rand() % 100);
            matrix2[row][column] = 1 + (rand() % 100);
        }
    }

    printf("matrix1:\n");
    printArray(matrix1);
    printf("\n\nmatrix2:\n");
    printArray(matrix2);
    printf("\n\nresult:\n");
    addMatrices(matrix1, matrix2);
    printfArray(result);
    printf("\n");

    return 0;
} 

void printArray(int a[][COLUMN]) {
    int row, column;

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            printf("%d   ", a[row][column]);
        }
        printf("\n");
    }
}

size_t addMatrices(int a[][COLUMN], int b[][COLUMN]) {
    int result[ROW][COLUMN] = { {0}, {0} };
    int row, column;

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            result[row][column] = a[row][column] + b[row][column];
        }
    } 

    return result;
}

如果您查看 main 方法的主体,编译器会指出存在错误,因为变量“result”在传递给函数 printArray() 时未定义。我了解为什么会出现此错误的概念(关于局部变量和传递参数),但我该如何解决此问题?

除此之外,我们将不胜感激任何其他意见或建议。

谢谢!

最佳答案

继续注释,您不能从函数返回局部声明的数组,因为局部声明的数组的内存是在函数堆栈上创建的,而函数堆栈在函数返回.要么声明resultmain并作为参数传递给 addMatrices或为 result 动态分配存储空间在addMatrices (因此它会在返回后继续存在)并返回指向内存块开头的指针并将其分配给 main 中的指针。 .声明 resultmain并将其作为参数传递是最简单的事情。

将这些部分放在一起,您可以按如下方式修改代码:

#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COLUMN 6

void addMatrices (int (*a)[COLUMN], int (*b)[COLUMN], int (*res)[COLUMN]);
void printArray (int (*a)[COLUMN]);

int main(void) {
    int row, column;
    int matrix1[ROW][COLUMN] = {{0}};
    int matrix2[ROW][COLUMN] = {{0}}; 
    int result[ROW][COLUMN]  = {{0}};

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            matrix1[row][column] = 1 + (rand() % 100);
            matrix2[row][column] = 1 + (rand() % 100);
        }
    }

    printf ("matrix1:\n");
    printArray (matrix1);
    printf ("\n\nmatrix2:\n");
    printArray (matrix2);
    printf ("\n\nresult:\n");
    addMatrices (matrix1, matrix2, result);
    printArray (result);
    putchar ('\n');  /* don't use printf to print a single character :) */

    return 0;
} 

void printArray(int a[][COLUMN]) {
    int row, column;

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            printf(" %3d", a[row][column]);
        }
        putchar ('\n');
    }
}

void addMatrices (int (*a)[COLUMN], int (*b)[COLUMN], int (*res)[COLUMN])
{
    int row, column;
    if (!a || !b || !res) {
        fprintf (stderr, "error: invalid parameter.\n");
        return;
    }

    for (row = 0; row < ROW; row++) {
        for (column = 0; column < COLUMN; column++) {
            res[row][column] = a[row][column] + b[row][column];
        }
    } 
}

示例使用/输出

$ ./bin/addmtrx
matrix1:
  84  78  94  87  50  63
  91  64  41  73  12  68
  83  63  68  30  23  70
  94  12  30  22  85  99
  16  14  92  57  63  97


matrix2:
  87  16  36  93  22  28
  60  27  27  37  69  30
  31  24  36   3  59  68
  57  43  74  20  38  25
  71  27  81  74  71  82


result:
 171  94 130 180  72  91
 151  91  68 110  81  98
 114  87 104  33  82 138
 151  55 104  42 123 124
  87  41 173 131 134 179

注意:C 编码风格通常支持所有小写 变量和函数名称,为常量和宏保留所有大写。为 java 和 C++ 保留 MixedCasecamelCase 名称。 (这是风格,所以完全取决于你,但是......)

关于用于添加矩阵的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460357/

相关文章:

python - 有优化这个算法的想法吗?

c - 你好.c : In function ‘main’ : Hello. c :13: warning: return type of ‘main’ is not ‘int’ ?

c - 从数组数据中获取平面切片

c++ - 在矩阵 C++ 中交换 2 行

c++ - 如何找到大矩阵的行列式

c++ - 如何优化大集合散点的插值?

循环 for 不起作用,因为我认为 C 中的乘法二维数组

c - 返回指向 C 中临时对象的指针

c - 将 SYSCALL 函数存储在函数指针数组中

python - 在 python 中执行反转置的最佳方法是什么?