Могу ли я передать int в функцию void в C? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь использовать функции, позволяющие пользователю ввести квадратную матрицу n на n и распечатать ее.

Функция ввода матрицы: ucitajmatricu

И распечатать его: ispisimatricu

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

void ucitajmatricu(int);
void ispisimatricu(int);

int main() {
  int n;
  scanf("%d", & n);

  ucitajmatricu(n);
  ispisimatricu(n);

  return 0;
}

void ucitajmatricu(int n) {
  int i, j;

  int MAT[n][n];

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

  return;
}

void ispisimatricu(int n) {
  int i, j, MAT[n][n];
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      printf("%d\t", MAT[i][j]);
    }
    printf("\n");
  }

  return;
}

Пример ввода: 3

1 2 3
4 5 6
7 8 9

Пример вывода:

1 2 3
4 5 6
7 8 9

Фактический вывод:

1 2 3
4 5 6
7 48 0

Ответы [ 2 ]

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

Чтобы пояснить приведенный выше ответ, когда вы объявляете переменную в функции, вы объявляете ее в стеке.

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

Чтобы использовать текущую реализацию, инициализируйте матрицу, выделив вместо этого кучу.Используйте calloc (), чтобы выделить и обнулить пространство.Затем, когда вы вернетесь, верните указатель на вашу матрицу.Недостатком является больше управления памятью требуется.

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

void ucitajmatricu (int n) {
...
int MAT [n] [n];

...

void ispisimatricu (int n) {
int i, j, MAT [n] [n];

Два объявления MAT [] [] находятся в разных функциях - они делаютне сохраняют свое значение и тот факт, что они имеют одно и то же имя, не имеет значения.

Объявите MAT [] [] один раз, вне функции.И, кстати, эта проблема, кажется, не имеет никакого отношения к названию вопроса.

РЕДАКТИРОВАТЬ после комментария

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...