@moneymakerXA

Как получить результат функции в main при работе с матрицами?

Всем доброго времени суток, мне нужно написать функцию суммы элементов главной диагонали матрицы. Программа полностью работает за одним исключением, у меня не получается вынести код в отдельную функцию. Возможно ошибка в параметрах которые я передаю в функцию, или в самом вызове функции

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sum (int n, int matrix[n][n]) {
    int sum = 0;
    for (int j = 0; j < n; ++j){
        for (int i = 0; i < n; ++i){
            if (j == i){
                sum += matrix[j][i];
            }
        }
    }
    return sum;
}

int main ()
{
    int n, i, j;
    int sum_of = 0;
    printf("n \n");
    scanf("%d",&n);
    int matrix[n][n];

    srand(time(0));
    for (i = 0; i < n; i++){
        for (j = 0; j < n; j++){
            matrix[i][j] = rand()%10;
        }
    }

    for (i = 0; i < n; i++){
        for (j = 0; j < n; j++){
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    sum_of = sum(matrix[][]);

    printf("%d", sum_of);

    return 0;
}
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
sum_of = sum(matrix[][]);

должно стать
sum_of = sum(n, matrix);

int sum (int n, int matrix[n][n]) {
    int sum = 0;
    for (int j = 0; j < n; ++j){
        for (int i = 0; i < n; ++i){
            if (j == i){
                sum += matrix[j][i];
            }
        }
    }
    return sum;
}

Это, конечно, работает, но лучше написать так:
int sum (int n, int matrix[n][n])
{
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += matrix[i][i];
    }
    return sum;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@dedalqq
Что то я сомневаюсь, что у вас программа работает. Вы пытаетесь в стеке задать масив произвольной длинны. В стеке можно создавтаь масивы только фиксированной длинны, так как под них выделяется память во время компиляции. В вашем же случае нужно использовать кучу (см функции malloc() и free()) https://en.wikipedia.org/wiki/C_dynamic_memory_all...

Это если мы говорим про C если же вы пишете это на C++ (пожалуйста различайте эти языки) то вам в помощь вектора
Ответ написан
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Программа полностью работает

Сумнительно.

Вот так:
printf("n \n");
    scanf("%d",&n);
    int matrix[n][n];

делать нельзя. Статический массив строится в момент компиляции, поэтому его размерность должна быть задана - странно, что у Вас компилятор замечания не выдал - или просто проигнорили?

Выделение памяти нужно делать таким образом:
int *matrix;

matrix = calloc( n * n, 1);

после чего matrix - указатель на int и всю программу соответственно нужно переделать под адресную арифметику (подозреваю, что задание было на изучение адресной арифметики :) )

По-хорошему, результат calloc нужно проверить - выделилась ли память и перед завершением программы сделать
free(matrix);
Ответ написан
@res2001
Developer, ex-admin
Обратите внимание на то как объявлена функция:
int sum (int n, int matrix[n][n])
И на то как вы ее вызываете:
sum_of = sum(matrix[][]);
Надеюсь дальше разберетесь сами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час