【问题标题】:C Function to Add Matrices添加矩阵的 C 函数
【发布时间】:2017-04-18 06:32:41
【问题描述】:

我是编码新手,目前正在学校学习 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() 时没有定义。我理解为什么会发生这个错误的概念(关于局部变量和传递参数),但是我该如何解决这个问题呢?

除此之外,非常感谢您提出任何其他意见或建议。

谢谢!

【问题讨论】:

  • int result[ROW][COLUMN] = { {0}, {0} }; 移至main。并致电void addMatrices(int a[][COLUMN], int b[][COLUMN], int result[][COLUMN]) {
  • 您不能从函数返回本地声明的矩阵int result[ROW][COLUMN] = { {0}, {0} };。它是在 函数堆栈 上创建的,该堆栈在函数 return 上被销毁。 (1) 动态分配 result 或 (2) 将其作为参数传递给您的 add 函数。
  • 只是一个想法:如果编译器抱怨一个 undefined 变量,也许 defining 它可能会有所帮助?哦,还有:C 不支持方法main 也是 C++ 中的一个函数
  • 至于你上次的征集意见,你学习C是被表扬的,没有更高级的语言可以帮助你理解编码并培养良好的技能,无论如何都会让你成为更好的程序员你最终编码的语言。了解 C 有很多内容(没有双关语),所以关键是放慢速度,享受学习过程,在这样的网站上积极主动,结交朋友使用 手册页,始终编译时启用 警告(例如,在您的编译字符串中使用 -Wall -Wextra)并且在编译干净且没有警告或错误的情况下不接受代码。

标签: c matrix


【解决方案1】:

从注释继续,您不能从函数返回本地声明的数组,因为本地声明的数组的内存是在 函数堆栈 上创建的,该堆栈在函数 return 时被销毁强>。在main 中声明result 并作为参数传递给addMatrices 或在addMatrices 中为result 动态分配存储空间(因此它会在返回后继续存在)并返回一个指向内存块开头的指针,然后将其分配给main 中的指针。在main 中声明result 并将其作为参数传递是最简单的做法。

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

#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 名称。 (这是风格,所以完全取决于你,但是......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多