Ошибка сегментации после передачи матрицы функции - PullRequest
0 голосов
/ 22 декабря 2018

Моя программа должна проверить, является ли матрица ввода магический квадрат .

Это почти сделано, но у меня проблема с фукцией.Я не уверен, почему, но он возвращает неправильные значения.Мне нужна функция, чтобы вернуть 1, если квадрат является магией, и вернуть 0, если квадрат не является магией.Я получаю странный вывод и ошибка сегментации.

пример ввода:

3 - size of square, square: 
8 1 6
3 5 7
4 9 2

пример вывода (функция возвращает 1, потому что квадрат - это магия), напечатанный на экране, это квадрат - это магия.

Код:

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

int is_magic(int m[][size], size_t size)
{
    int sum = 0;

    for(size_t col = 0; col < size; col++)
    {
        sum += m[col];
    }

    for(size_t row = 1; row < size; row++)
    {
        int psum = 0;
        for(size_t col = 0; col < size; col++)
        {
            psum += m[col + row * size];
        }
        if(psum != sum) return 0;
    }

    for(size_t col = 0; col < size; col++)
    {
        int psum = 0;
        for(size_t row = 0; row < size; row++)
        {
            psum += m[col + row * size];
        }
        if(psum != sum) return 0;
    }
    return 1;
}


int main()
{
      int size,row,column;
      scanf("%d",&size);
      int *matrix
      matrix = (int**)malloc(size * sizeof(int*));
            for (row = 0; row < size; row++)
                  matrix[row] = (int*)malloc(size * sizeof(int));


      for (row = 0; row < size; row++)
             for (column = 0; column < size; column++)
                   scanf("%d ", &matrix[row][column]);


       if(is_magic(matrix, size))
      {
            printf("Magic square");
      }
      else
      {
            printf("Not magic square");
      }
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Двумерный массив - это просто непрерывный участок памяти.Если массив имеет одинаковое количество столбцов и строк, порядок их хранения в этом случае не важен.

int is_magic(int *m, size_t size)
{
    int sum = 0;

    for(size_t col = 0; col < size; col++)
    {
        sum += m[col];
    }

    for(size_t row = 1; row < size; row++)
    {
        int psum = 0;
        for(size_t col = 0; col < size; col++)
        {
            psum += m[col + row * size];
        }
        if(psum != sum) return 0;
    }

    for(size_t col = 0; col < size; col++)
    {
        int psum = 0;
        for(size_t row = 0; row < size; row++)
        {
            psum += m[col + row * size];
        }
        if(psum != sum) return 0;
    }
    return 1;
}

int m[3][3] = 
{
    {8, 1, 6},
    {3, 5, 7},
    {4, 9, 2},
};

int m1[3][3] = 
{
    {8, 1, 6},
    {3, 9, 7},
    {4, 9, 2},
};


int main()
{
    printf("%d\n", is_magic(m,3));
    printf("%d\n", is_magic(m1,3));

    return 0;
}

Рабочий пример: https://ideone.com/P4C3H2

0 голосов
/ 22 декабря 2018

Вызов is_magic должен быть

flag = is_magic(matrix,size);

, поскольку это соответствует определению вашей функции.

0 голосов
/ 22 декабря 2018

Проблема с сигнатурой функции is_magic.Вам нужно передать ему двумерный массив;

int is_magic(int **matrix,int size);

Здесь вы передаете указатель на указатель типа int.

Вам нужно передать двумерный массив следующим образом:

int is_magic(int matrix[][size], int size);

Убедитесь, что вы используете компилятор, совместимый с C99.

Быстрое примечание, вам может понадобиться или не нужно менять порядок аргументов для функции is_magic.

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

int is_magic(int size, int matrix[][size]);
0 голосов
/ 22 декабря 2018

Попробуйте следующее:

#include<stdio.h>

int is_magic(int **matrix,int size)
{
int sum, sum1, sum2;
int row, column = 0;
//For diagonal elements
sum = 0;
for (row = 0; row < size; row++)
{
    for (column = 0; column < size; column++)
    {
        if (row == column)
            sum = sum + matrix[row][column];
    }
}

//For Rows
for (row = 0; row < size; row++)
{
    sum1 = 0;
    for (column = 0; column < size; column++)
    {
        sum1 = sum1 + matrix[row][column];
    }
    if (sum == sum1)
        return 1;
    else
    {
        return 0;
        break;
    }
}

//For Columns
for (row = 0; row < size; row++)
{
    sum2 = 0;
    for (column = 0; column < size; column++)
    {
        sum2 = sum2 + matrix[column][row];
    }
    if (sum == sum2)
        return 1;
    else
    {
        return 0;
        break;
    }
}
}


int main()
{
int size;
scanf("%d",&size);
int matrix[size][size];
int row=0, column = 0;
int flag = 0;

for (row = 0; row < size; row++)
{
    for (column = 0; column < size; column++)
        scanf("%d", &matrix[row][column]);
    printf("%d\n", matrix[row][column]);
}

flag = is_magic(size,matrix);
if (flag == 1)
    printf("1");
else
    printf("0");

return 0;
}
...