Нужно сделать так,чтобы можно было передавать в функцию и статическую, и динамическую матрицы(си)

Есть такое определение функции

void input(int **matrix, int n, int m)

Но оно работает только для динамических матриц. Как можно было бы изменить,чтобы работало и для статических и динамических? Или что можно сделать со статической матрицой но притом,чтобы она оставалась статической.


Ответы (1 шт):

Автор решения: AlexGlebe

Можно сделать подделку. Динамическую матрицу, указывающую на строки статической.

// $ gcc -Wall -std=c11 -Wextra -Wpedantic dynmat.c -o dynmat && ./dynmat
void input(int **matrix, int n, int m) {
  matrix[3][3] = 777 ;
  }

# include <stdlib.h>
# include <stdio.h>  
  
int main(){
  int n = 7 ;
  int m = 8 ;
  int static_matr [n][m];
  static_matr[3][3] = 888 ;
  printf("0. static_matr[3][3] = %d\n",static_matr[3][3]);
  
  int * * dynamic_matr = malloc ( sizeof (int * ) * n ) ;
  for ( int i = 0 ; i < n ; ++ i )
    dynamic_matr [ i ] = static_matr [ i ] ;

  input ( dynamic_matr , n , m ) ;

  free ( dynamic_matr ) ;

  printf("1. static_matr[3][3] = %d\n",static_matr[3][3]);          

}

Проверка :

0. static_matr[3][3] = 888
1. static_matr[3][3] = 777

Дополнительную память будет занимать чуть больше n*m+n вместо n*m. И установка указателей на статическую матрицу займёт мало времени n.

→ Ссылка