Использование двухмерных массивов в качестве параметров

0

Я пытаюсь сделать некоторые функции, работающие на двухмерных массивах:

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) '

Я знаю, что могу использовать вектор, но я стараюсь практиковать и запоминать использование указателей и массивов.

  • 0
    Вы также можете рассмотреть возможность использования шаблона класса с измерениями в качестве интегральных параметров.
  • 1
    int** не является двумерным массивом. Итак, вот ваша проблема.
Показать ещё 1 комментарий
Теги:
arrays

2 ответа

1
Лучший ответ

Объявление матрицы в форме <type> <name>[<dim1>][<dim2>] определяет блок памяти с неявным шагом dim1. Доступ к внутренним элементам осуществляется с использованием кратных dim1 для достижения правильной строки и смещения оттуда вторым измерением.

тип <type> <name>** - указатель на массив указателей - совсем другой. Структура состоит из массива указателей на строки данных. Они должны быть распределены и связаны надлежащим образом перед вызовом подпрограммы. Также не требуется, чтобы они были смежно распределены, и косвенный поиск должен выполняться каждому элементу в каждой новой строке.

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

  • 0
    Так я должен просто объявить my_matrix как int **, выделить его, а затем все его строки? int ** my_matrix = (int **) malloc (n sizeof (int )); для (int i = 0; i <n; i ++) my_matrix [i] = (int *) malloc (m * sizeof (int)); Как это?
  • 0
    Вот и все. Тогда вы можете сохранить оригинальные функции подписи.
0

Измените код следующим образом

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);
  • 0
    Почему n должно быть постоянным? Я не мог установить его значение в основной функции, как я хотел тогда.
  • 0
    Потому что это должно быть частью типа. Двумерный массив NxM - это просто одномерный массив, содержащий N * M элементов (строка за строкой), но он имеет специальный тип, указывающий компилятору на двойную индексацию. Компилятор должен знать, сколько элементов есть в любом измерении, кроме первого, чтобы правильно рассчитать смещение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню