Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 14:45   #1
AesmaDiv
Пользователь
 
Регистрация: 04.12.2010
Сообщений: 19
По умолчанию Передача 2-мерного массива неопределенной размерности в функцию

Братцы, просветите, пожалуйста.
Пищу функцию для поиска пути по ячейкам. Прототип функции выглядит следующим образом:

void CalculatePath(PATH* path,PATH_CELL xcell[][10],int Count)

,где PATH* path - Указатель на массив пути
PATH_CELL xcell[][10] - Указатель на заполненый массив описания состояния ячеек поля !!! ТУТ ЗАРЫТА СОБАКА !!!
int Count - Размерность массива поля PATH_CELL[Count][Count]

Вызывается функция так:
***Глобальные переменные***
...
int cellCount = 10; //размерность поля
PATH Path[50]; //массив пути (50, потому что путь не как не превысит 50 шагов, а с динамическим массивом у меня голова пухнет.
PATH_CELL PCell[cellCount][cellCount]; //массив описания состояния ячеек поля
...
***main.cpp***
...
CalculatePath(Path,PCell,cellCount) ;
...

Чтоб передать функции 2-мерный массив нужно явно указать кол-во столбцов. В данном случае 10. Но хочется сделать функцию универсальной. То есть размерность может быть разная 5х5, 10х10 или 100х100. Как же обойтись без явного объявления размерности?
AesmaDiv вне форума Ответить с цитированием
Старый 06.02.2012, 15:10   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2AesmaDiv
Цитата:
Чтоб передать функции 2-мерный массив нужно явно указать кол-во столбцов. В данном случае 10. Но хочется сделать функцию универсальной. То есть размерность может быть разная 5х5, 10х10 или 100х100. Как же обойтись без явного объявления размерности?
если массив у тебя статический (просто хочешь менять константу размерности), можно использовать шаблонную функцию и ссылку на массив
Код:
template <typename T, int row, int col>
void foo(const T (&arr)[row][col])
{
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}
причем размерность массива в качестве параметров функции тебе передавать не нужно (т.к он у тебя статический). размерность передается через шаблонные параметры.
пример использования:
Код:
int arr[5][5] = {
	{1,2,3,4,5},
	{6,7,8,9,10},
	{11,12,13,14,15},
	{16,17,18,19,20},
	{21,22,23,24,25},
};

foo(arr);
пс.
ну и да
Код:
const int cellCount = 10; //размерность поля
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 06.02.2012 в 15:26.
pproger вне форума Ответить с цитированием
Старый 06.02.2012, 18:56   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

К тому, что уже написано, добавлю, что если у вас двумерный массив имеет обе размерности равные между собой, как это в вашем случае для массива PATH_CELL[Count][Count], то вы можете упростить шаблонную функцию и написать ее в виде

template <typename T, size_t N>
void h1( T ( * a )[N] );


Например,

Код:
template <typename T, size_t N>
void h1( T ( * a )[N] )
{
	for ( size_t i = 0; i < N; i++ )
	{
		for ( size_t j = 0; j < N; j++ )
		{
			a[i][j] = 0;
		}
	}
}
Здесь операторы внутри тела функции взяты лишь для примера.

То есть, чтобы вы не мучались, в вашем конкретном случае функцию

void CalculatePath(PATH* path,PATH_CELL xcell[][10],int Count);

можно определить как шаблонную функцию следующего вида

template <int Count>
void CalculatePath( PATH* path, PATH_CELL ( * xcell )[Count] );


Как видите, даже функция упростилась, так как стало меньше параметров в ее объявлении.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 06.02.2012 в 19:05.
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Произведение элементов массива в функции (передача массива в функцию) (Delphi) Toxa16 Помощь студентам 1 23.04.2011 04:42
Передача массива в функцию GladiatoR24 Общие вопросы C/C++ 3 24.11.2010 22:51
Си++. Передача массива в функцию. Diamond2107 Помощь студентам 7 03.12.2009 20:15
передача массива в функцию JOFRIF Общие вопросы C/C++ 8 02.08.2009 12:46
Передача массива в функцию Vistar Общие вопросы C/C++ 1 27.04.2009 08:08