websofter
@websofter
Programmer...

Как передать двумерный массив в функцию в виде параметра в C++?

float det(float* M[], int n)
{
	if (n == 1)
	{
		return M[0][0];
	}
	if (n == 2)
	{
		float s = (M[0][0] * M[1][1]) - (M[1][0] * M[0][1]);
		return s;
	}

//Другой код - суть не важна

}

Хочу ее использовать. Для этого создаю массив и передаю:
float m[][2] = { { 2.2, 3.2 }, { 5.1, 4.5 }};
	det(&m, 2);//Не передается

Как передать его?
  • Вопрос задан
  • 31100 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Koss1024
Нужно понимать, что массив в С = указатель на память
Соответственно двумерный массив = это указатель на память и еще понимание сколько элементов в каждой строчке таблицы

a[m][n] тоже что *(a+ sizeof(type)*n + m)

Именно поэтому при передаче параметров в функции нужно явно указать количество элементов в строке
void foo(float arr[2][2])
void foo(float arr[][2]) // или так достаточно
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
float* M[]

Это массив указателей на float, указатель на массив -- это float (* M)[N]. В С++ и С до С99 на месте N обязательно должна быть константа.
Ответ написан
Комментировать
risik
@risik
Программист
Остальные Вам правильно написали. Надо указывать размер строки.

Если для Вас это неприемлемо, то есть другие варианты. Например, принимать
float det(float**m, int rows, int cols)

Но тогда передавать надо сложнее.
например:

int rows = ...;
int cols = ...;
float **m;
m = calloc(rows, sizeof(float*));
for (int i=0; i<rows; i++) {
  m[i] = calloc(cols, sizeof(float));
}
/* как-то заполняете значения */
float res = det(m, rows, cols);


Однако, такой код нормален для C, но не для С++. В C++ коде я бы поостерегся передавать двумерный массив. Впрочем, как и одномерный массив. Вместо это лучше сделать класс матрица. И все особенности хранения данных решать уже в этом классе. Равно как и метод нахождения определителя.
Ответ написан
Комментировать
Можно функцию det сделать шаблонной, в таком случае размер массива еще и будет известен во время компиляции:

template <size_t N, size_t M>
float det(float (&matrix)[N][M])
{
   /* some calculations */
}

/* ... */

float matrix[5][6] = { /* ... */ };
float result = det(matrix);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы