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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2011, 16:59   #1
FelixXXI
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 48
По умолчанию Передача двумерного массива в функцию

До последнего времени для передачи двумерного массива в функцию пользовался следующими вариантами
Вар1:
Код:
#include <iostream>
using std::cout;
using std::cin;

void funArray(int mass[][6], const int nstr, const int nstb);

int main()
{	
	int Arr[5][6]={
					{2,13,2,5,0,3},
					{12,3,5,0,7,5},
					{1,2,3,4,5,-4},
					{121,11,2,3,4,8},
					{3,5,3,7,9,12}
				   };
	funArray(Arr,5,6);

	cin.get();
	cin.get();
	return 0;
}

void funArray(int mass[][6], const int nstr, const int nstb)
{	
	for(int i=0; i<nstr; i++)
	{
		cout<<"\n";
		for(int j=0; j<nstb; j++)
				cout<<mass[i][j]<<"  ";
	}
}
Для динамических массивов использую Вариант2:
Код:
#include <iostream>
using std::cout;
using std::cin;

void funArray(int **mass, const int nstr, const int nstb);

int main()
{	//ввод размера динамического двумерного массива:
	int N, M;
	cin >>N>>M;
	//выделение места в памяти под динамический двумерный массив:
	int **Arr=new int* [N];
	for(int i=0; i<N; i++)
		Arr[i]=new int [M];
	//заполнение массива данными:
	for(int i=0; i<N; i++)
		for(int j=0; j<M; j++)
			cin>>Arr[i][j];
	//передача массива в функцию:
	funArray(Arr,N,M);

	cin.get();
	cin.get();
	return 0;
}

void funArray(int **mass, const int nstr, const int nstb)
{	
	for(int i=0; i<nstr; i++)
	{
			cout<<"\n";
			for(int j=0; j<nstb; j++)
				cout<<mass[i][j]<<"  ";
	}
}
А вот почему не работает следующий код, никак не могу понять. Можете объяснить, что не так?
Код:
#include <iostream>
using std::cout;
using std::cin;

void funArray(int *mass, const int nstr, const int nstb);

int main()
{	
	int Arr[5][6]={
					{2,13,2,5,0,3},
					{12,3,5,0,7,5},
					{1,2,3,4,5,-4},
					{121,11,2,3,4,8},
					{3,5,3,7,9,12}
				   };
	funArray(&Arr,5,6);

	cin.get();
	cin.get();
	return 0;
}

void funArray(int *mass, const int nstr, const int nstb)
{	
	for(int i=0; i<nstr; i++)
			for(int j=0; j<nstb; j++)
				cout<<mass[i][j]<<"  ";
}

Последний раз редактировалось FelixXXI; 27.08.2011 в 17:06.
FelixXXI вне форума Ответить с цитированием
Старый 27.08.2011, 17:12   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2FelixXXI
потому что ты не понимаешь, что делаешь
Код:
#include <iostream>
using std::cout;
using std::cin;

void funArray(int *mass, const int nstr, const int nstb);

int main()
{	
	int Arr[5][6]={
					{2,13,2,5,0,3},
					{12,3,5,0,7,5},
					{1,2,3,4,5,-4},
					{121,11,2,3,4,8},
					{3,5,3,7,9,12}
				   };
	funArray(&Arr[0][0], 5, 6);

	return 0;
}

void funArray(int *mass, const int nstr, const int nstb)
{	
	for (int i = 0; i < nstr; i++) {
		for (int j = 0; j < nstb; j++)
			cout << mass[j + i * nstb] << "  ";
		cout << endl;
	}
}



пс.
Код:
#include <iostream>

using std::cout;
using std::cin;

template <int row, int col>
void funArray(int (&arr)[row][col])
{
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++)
			cout << arr[i][j] << " ";
		cout << endl;
	}
}

int main()
{	
	int Arr[5][6]={
					{2,13,2,5,0,3},
					{12,3,5,0,7,5},
					{1,2,3,4,5,-4},
					{121,11,2,3,4,8},
					{3,5,3,7,9,12}
				   };

	funArray(Arr);
}
не проще?)
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; 27.08.2011 в 17:22.
pproger вне форума Ответить с цитированием
Старый 27.08.2011, 18:03   #3
FelixXXI
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 48
По умолчанию

Цитата:
потому что ты не понимаешь, что делаешь
Действительно, не ведаю, что творю.
Это ж надо было представить в функции двумерный массив, как одномерный, и при этом не утруждать себя пересчётом его индекса!

2pproger спасибо!
FelixXXI вне форума Ответить с цитированием
Старый 27.08.2011, 18:08   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2FelixXXI
не только в этом дело. ты передавал в функцию int (*)[5][6], когда функция принимает int *. т.к статический двумерный массив располагается в памяти последовательно, то можно передать указатель на первый элемент, дальше уже вручную двигаться.

вообще, раз массив статический, то лучший вариант с шаблонами, ибо не приходится дополнительно передавать размерность
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; 27.08.2011 в 18:11.
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++ Builder] Передача двумерного массива в функцию newStudent Помощь студентам 1 26.11.2010 10:46
Передача двумерного массива в функцию StudentPolitech Общие вопросы .NET 9 30.10.2010 22:20
Передача в функцию двумерного массива структур Spandei Общие вопросы C/C++ 1 21.05.2010 01:11
Передача двумерного массива в функцию Megapixar Общие вопросы C/C++ 12 01.04.2010 16:04
Передача двумерного динамического массива в метод Дырдин Общие вопросы C/C++ 1 19.03.2010 09:45