0

I'm new to coding and am currently learning C at school. I had a question regarding how to add matrices in C using a function. I'm facing some difficulties and was hoping to get some words of advice here. The conditions that my instructor gave the class are 1) two 5 x 6 matrices with integer entries from 1 - 100, 2) define and use your own function. Here's the code I've written so far:

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

If you look at the body of the main method, the compiler says that there's an error because the variable "result" isn't defined when being passed to the function printArray(). I understand the concept of why this error occurs (regarding local variables and passing parameters), but how can I solve this problem?

Aside from this, any other words of advice or suggestions are greatly appreciated.

Thank you!

4
  • int result[ROW][COLUMN] = { {0}, {0} }; move to main. and call void addMatrices(int a[][COLUMN], int b[][COLUMN], int result[][COLUMN]) { Commented Apr 17, 2017 at 22:10
  • 1
    You cannot return a locally declared matrix int result[ROW][COLUMN] = { {0}, {0} }; from a function. It is created on the function stack which is destroyed on function return. Either (1) dynamically allocate result or (2) pass it as a parameter to your add function. Commented Apr 17, 2017 at 22:10
  • 1
    Just an idea: If the compiler complains about an undefined variable, maybe defining it might help? Oh, and: C does not support methods. And main is a function in C++, too. Commented Apr 17, 2017 at 22:10
  • As to your last solicitation for comment, you are commended for learning C, there is no finer higher-level language to help you understand coding and develop good skills that will make you a better programmer no matter what language you end up coding in. Understand there is a lot to C, (no pun intended), so the key is to slow down, enjoy the learning process, be proactive on sites like this, make friends with the man pages, always compile with warnings enabled (e.g. with -Wall -Wextra in your compile string) and do not accept code until it compiles cleanly without warning or error. Commented Apr 17, 2017 at 22:18

1 Answer 1

2

Continuing from the comment, you cannot return a locally declared array from a function because the memory for the locally declared array is created on the function stack which is destroyed on function return. Either declare result in main and pass as a parameter to addMatrices or dynamically allocate storage for result in addMatrices (so it will survive return) and return a pointer to the beginning of the block of memory and assign it to a pointer in main. Declaring result in main and passing it as a parameter is the easiest thing to do.

Putting those pieces together, you could modify your code as follows:

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

Example Use/Output

$ ./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

note: C coding style generally favors all lower-case variable and function names, reserving all upper-case for constants and macros. Leave the MixedCase and camelCase names for java and C++. (it is style, so it is completely up to you, but...)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.