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


void scan_arrays (int *array, int row, int column);

int main (void){

  int row;
  int column;

  printf("Enter sizes: ");
  scanf("%d %d",&row,&column);


  int firstarray[row][column];
  int secondarray[row][column];

  printf("Enter array 1 elements:\n");
  scan_arrays(&firstarray,row,column);

  printf("Enter array 2 elements:\n");
  scan_arrays(&secondarray,row,column);

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

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

  return 0;
}

void scan_arrays (int *array, int row, int column){

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

}```
I've only been coding for a couple of months.
4
dan 19 Ноя 2019 в 02:29
Отвечает ли это на ваш вопрос? Как передать 2D-массив (матрицу) в функция в C?
 – 
Bob__
19 Ноя 2019 в 02:59
Привет Дэн, в вашем заключительном комментарии упоминается, что вы новичок в программировании. Я подумал, что эта ссылка может оказаться для вас информативной. Это не отменяет ответа. Надеюсь, это улучшит ваше понимание. Ответ на ваш вопрос работает, потому что он оценивается во время компиляции. Во время времени выполнения порядок оценки параметров вашей функции не гарантируется, как указано. У меня были неожиданные результаты в моем собственном коде, потому что я не полностью понимал это раньше.
 – 
Andrew Falanga
19 Ноя 2019 в 04:02

1 ответ

Функция должна быть объявлена ​​следующим образом:

void scan_arrays (int row, int column, int array[row][column]);

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

Функция будет вызываться так:

scan_arrays(row, column, firstarray)

А остальная часть вашего кода может оставаться неизменной.


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

int (*firstarray)[column] = malloc( sizeof(int[row][column]) );
if ( firstarray == NULL )
    // ...error handling

И код, использующий firstarray, может остаться без изменений.

5
M.M 19 Ноя 2019 в 03:17
1
Большое спасибо, это сработало. Не могу поверить, что это было так просто.
 – 
dan
19 Ноя 2019 в 03:11