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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2014, 15:51   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию Передать двумерный массив в функцию для заполнения данными | C++

Подскажите, пожалуйста, можно ли передать двумерный массив в функцию без использования указателей? Мне просто интересно. Если да, то как? С одномерным массивом это проходит. И изменения вносятся.
Код:
#include <iostream>
using namespace std;

void fillArray(int Arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		Arr[i] = i + 1;
	}
}

void showArr(int Arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		cout << Arr[i] << "  ";
	}
}


//==================================
int main()
{
	setlocale(LC_ALL, "rus");

	int Array[10];

	fillArray(Array, 10); 
	showArr(Array, 10);

	return 0;
}
marenko.lilia вне форума Ответить с цитированием
Старый 01.09.2014, 16:08   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

А чем не нравятся указатели? Лень две звёздочки поставить?
Пишем void function(int **A){} и радуемся.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.09.2014, 16:11   #3
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
А чем не нравятся указатели? Лень две звёздочки поставить?
Пишем void function(int **A){} и радуемся.
Всё нравится )) И указатели, и две звездочки.
Но интересно человеку! Понимаете??

И почему надо использовать указатели в этом случае, если возможно и без них мы можем обойтись?
marenko.lilia вне форума Ответить с цитированием
Старый 01.09.2014, 16:14   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

В С++ нет понятия двумерного массива, соответственно нет никакого специального для них механизма.
pu4koff вне форума Ответить с цитированием
Старый 01.09.2014, 16:33   #5
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Оказывается можно!
Немного поэкспериментировала - то получатся так:
Код:
#include <iostream>
using namespace std;

void showArr(int Arr[][10], int size)
{
	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size; j++)
			cout << Arr[i][j] << "  ";

		cout << endl;
	}	
}

void fillArray(int Arr[][10], int size)
{
	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size; j++)
			Arr[i][j] = i;
	}
}
//==================================
int main()
{
	setlocale(LC_ALL, "rus");

	const int size = 10;
	int Array2[size][size];

	fillArray(Array2, size);

	showArr(Array2, size);

	return 0;
}
Главное при определении функции указать количество столбцов.
Тоже мне "профессионалы" Лишь бы поумничать...
marenko.lilia вне форума Ответить с цитированием
Старый 01.09.2014, 16:45   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
Оказывается можно!
Тоже мне "профессионалы" Лишь бы поумничать...
У каждого свой стиль. Я статическими массивами не пользуюсь, а динамические в функцию передаются по указателям.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.09.2014, 16:56   #7
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Согласна.
Мне просто интересно было разобраться можно ли так сделать, как спрашивала.

Если вас задело - не обижайтесь ) Это шутка была! По Вам то видно, что Вы дядя серьезный ))
marenko.lilia вне форума Ответить с цитированием
Старый 01.09.2014, 17:01   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
Согласна.
Мне просто интересно было разобраться можно ли так сделать, как спрашивала.

Если вас задело - не обижайтесь ) Это шутка была! По Вам то видно, что Вы дядя серьезный ))
Я ещё и весёлый. Шутки понимаю .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.09.2014, 19:12   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
Подскажите, пожалуйста, можно ли передать двумерный массив в функцию без использования указателей?
Можно.

http://rextester.com/XAWD27437



Код:
#include<iostream>
using namespace std;

template<size_t N> void fillArray(int (&Arr)[N])
{
	for (int i = 0; i < N; i++)
		Arr[i] = i + 1;
}

template<size_t N> void showArr(const int  (&Arr)[N])
{
	for (int i = 0; i < N; i++)
		cout << Arr[i] << "  ";
}


//==================================
int main()
{
	setlocale(LC_ALL, "rus");

	int Array[10];

	fillArray(Array); 
	showArr(Array);

	return 0;
}
Обратите внимание: размер сишного массива известен времени компиляции, поэтому передавать его размер в качестве аргумента функции не нужно.

Компилятор вычислит размер массива автоматически.

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
У каждого свой стиль. Я статическими массивами не пользуюсь, а динамические в функцию передаются по указателям.
На языке с++ не существует динамических массивов.

Последний раз редактировалось Stilet; 02.09.2014 в 19:35.
_Bers вне форума Ответить с цитированием
Старый 01.09.2014, 19:23   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
Оказывается можно!
Код:
void showArr(int Arr[][10], int size)
Вы ошиблись: в данном случае вы передали указатель.
Пусть вас не смущает отсутствие звездочки - это наследие языка си.

На языке си для массивов существует альтернативный синтаксис для аргументов функций являющихся массивами.

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


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

На языке си нет ссылок, только указатели.

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

http://rextester.com/UJA93052

Код:
#include <type_traits>
#include <iostream>
using namespace std;

void showArr(int Arr[][10], int size)
{
    cout<<"is pointer? (must be true) "<< ::std::is_pointer< decltype(Arr) >::value<<endl;
}

int main()
{
	int Array2[10][10];

	showArr(Array2, 11);
	return 0;
}
Резюмируя: если хотите передать массив в функцию не через указатель, то передавайте по ссылке.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить новую пустую строку (для заполнения данными) в DBGridEh? sergeykom Компоненты Delphi 0 13.04.2014 17:48
Передать Variant и Массив в функцию VBA sir.andrey Помощь студентам 0 13.04.2013 06:23
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Передать двумерный массив через сокет (Debian) Phaeleh Qt и кроссплатформенное программирование С/С++ 1 29.11.2010 07:08
Как передать параметру записи, что в нем параметр это статический массив с данными? SkAndrew Общие вопросы Delphi 6 26.06.2009 02:02