2013-11-21 4 views
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

Вы также можете рассмотреть использование класса шаблонов с размерами в качестве интегральных параметров. – Pete

+1

'int **' не является двумерным массивом. Итак, вот твоя проблема. – AnT

+0

«Я пытаюсь практиковать и запоминать использование указателей и массивов». Затем, как этот код написан, вы должны скомпилировать его как C, потому что по крайней мере через C++ 11 язык не поддерживает массивы переменной длины, так как вы 'используется в 'main()'. Некоторые поставщики поддерживают его по расширению, но он не является частью стандарта. И если вы используете их в 'main', есть ли причина, по которой вы решили * не * использовать их в списке параметров? – WhozCraig

ответ

1

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

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

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

+0

Так что я должен просто объявить my_matrix как int **, выделить его, а затем все его строки? int ** my_matrix = (int **) malloc (n * sizeof (int *)); for (int i = 0; i kpagcha

+0

Вот и все. Затем вы можете сохранить оригинальные сигнатуры функций. – Pekka

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 должно быть постоянным? Я не мог установить его значение в основной функции, как мне хотелось. – kpagcha

+0

Потому что он должен быть частью типа. Двумерный массив NxM - это просто одномерный массив, содержащий элементы N * M (строка за строкой), но имеет специальный тип, который указывает компилятору, что допускается двойное индексирование. Компилятор должен знать, сколько элементов есть в любом измерении, кроме первого, чтобы правильно вычислить смещение. – yeputons

+0

Вы можете попробовать использовать стандарт C11 или передать массив и его размер отдельно, а затем преобразовать его в соответствующий тип внутри функции. Это может помочь преодолеть предел. Вы также можете сделать индексацию самостоятельно. – yeputons

Смежные вопросы