Я пытаюсь сделать некоторые функции, работающие на двухмерных массивах:
void display_matrix(int**, int, int);
void gen_matrix(int**, int, int);
int main()
{
srand(time(0));
int m=5, n=3;
int my_matrix[m][n];
gen_matrix(my_matrix, m, n);
display_matrix(my_matrix, m, n);
}
Я не знаю, что случилось, но я получаю следующую ошибку при вызове функций: [Ошибка] не может преобразовать 'int() [(((sizetype) (((ssizetype) n) + -1)) + 1 )] 'to' int * 'для аргумента' 1 'to' void gen_matrix (int **, int, int) '
Я знаю, что могу использовать вектор, но я стараюсь практиковать и запоминать использование указателей и массивов.
Объявление матрицы в форме <type> <name>[<dim1>][<dim2>]
определяет блок памяти с неявным шагом dim1. Доступ к внутренним элементам осуществляется с использованием кратных dim1 для достижения правильной строки и смещения оттуда вторым измерением.
тип <type> <name>**
- указатель на массив указателей - совсем другой. Структура состоит из массива указателей на строки данных. Они должны быть распределены и связаны надлежащим образом перед вызовом подпрограммы. Также не требуется, чтобы они были смежно распределены, и косвенный поиск должен выполняться каждому элементу в каждой новой строке.
Преимущество состоит в том, что строки могут быть разных длин, подходящих для некоторых алгоритмов, которые не имеют прямоугольной структуры.
Измените код следующим образом
const int n = 3;
void display_matrix( int ( * )[n], int );
void gen_matrix( int ( * )[n], int);
int main()
{
srand(time(0));
const int m = 5;
int my_matrix[m][n];
gen_matrix( my_matrix, m );
display_matrix(my_matrix, m );
}
Или вы можете сохранить свои функции как определенные, но называть их, например, как
gen_matrix( reinterpret_cast<int **>( my_matrix ), m, n);
int**
не является двумерным массивом. Итак, вот ваша проблема.