2017-04-17 95 views
0

我是新来的编码,目前在学校学习C.我有一个关于如何使用函数在C中添加矩阵的问题。我遇到了一些困难,希望能在这里得到一些建议。我的老师给这门课的条件是:1)两个5×6的矩阵,整数入口从1到100; 2)定义和使用你自己的函数。下面是我到目前为止已经编写的代码:C函数添加矩阵

#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; 
} 

如果你看一下主要方法体,编译器说,由于被传递到当变量“结果”没有定义有错误函数printArray()。我理解为什么会发生此错误的概念(关于局部变量和传递参数),但我该如何解决这个问题?

除此之外,任何其他建议或建议的话都非常感谢。

谢谢!从注释

+0

'int result [ROW] [COLUMN] = {{0},{0}};'移动到'main'。并调用'void addMatrices(int a [] [COLUMN],int b [] [COLUMN],int result [] [COLUMN]){' – BLUEPIXY

+1

您不能返回本地声明的矩阵'int result [ROW] [COLUMN] = {{0},{0}};'来自函数。它是在函数栈*上创建的,它在函数**返回**上被**销毁。 (1)动态分配'result'或(2)将它作为参数传递给你的add函数。 –

+1

只是一个想法:如果编译器抱怨** undefined **变量,也许_defining_它可能有帮助?哦,并且:C不支持_methods_。 'main'也是C++中的一个_function_。 – Olaf

回答

2

继续,你不能从一个功能,因为它是上功能回报摧毁了函数栈上创建的本地声明数组的内存返回一个局部声明数组。要么在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 

注:Ç编码风格通常有利于所有较低case变量和函数名,保留所有大写 for consta nts和宏。 java和C++的名称分别为MixedCasecamelCase。 (这是风格,所以它完全取决于你,但...)