Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как передать массив в функцию по значению? 
V
    Опции темы
Dmitriy2k
Дата 30.3.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



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

FuncArray(int arr[][20]){
...
}

main()
{
    int a[2][20];
    FuncArray(a);
}

мне же нужно чтобы передавалась в функцию копия массива, чтобы можно было в функции
изменять значения элементов, не повреждая исходный массив.
PM MAIL   Вверх
bsa
Дата 30.3.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
typedef int Array[2][20];
FuncArray(Array arr)
{
 ....
}
main()
{
    Array a;
    FuncArray(a);
}


Это сообщение отредактировал(а) bsa - 30.3.2008, 11:40
PM   Вверх
Dennnis
Дата 30.3.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Код

struct Arr
{
    int arr[2][20];
};

FuncArray(Arr arr){
...
}
main()
{
    Arr a;
    FuncArray(a);
}


или

Код

FuncArray(const std::vector<std::vector<int> >& arr){
...
}

main()
{
    std::vector<std::vector<int> > arr;
    FuncArray(arr);
}


Это сообщение отредактировал(а) Dennnis - 30.3.2008, 11:39
--------------------
Get Rich or Die Tryin'
PM   Вверх
bsa
Дата 30.3.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Dennnis, во втором случае передачи идет по ссылке, по сути, тоже самое, что по указателю.
PM   Вверх
Dennnis
Дата 30.3.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4




Цитата(bsa @  30.3.2008,  11:41 Найти цитируемый пост)
Dennnis, во втором случае передачи идет по ссылке, по сути, тоже самое, что по указателю. 

Ты имеешь ввиду надо так:
Код

FuncArray(std::vector<std::vector<int> > arr/*Теперь копирует*/){
...
}
main()
{
    std::vector<std::vector<int> > arr;
    FuncArray(arr);
}

--------------------
Get Rich or Die Tryin'
PM   Вверх
bsa
Дата 30.3.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Dennnis, да. Теперь уже передача по значению.
PM   Вверх
Dmitriy2k
Дата 30.3.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Цитата

std::vector<std::vector<int> > arr;


Мне не очень понятно что означают угловые скобки. Я сколько писал на Си ни разу не встречал :(
[quote]

PM MAIL   Вверх
bsa
Дата 30.3.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Dmitriy2k @ 30.3.2008,  14:50)
Цитата

std::vector<std::vector<int> > arr;


Мне не очень понятно что означают угловые скобки. Я сколько писал на Си ни разу не встречал :(

Это С++. std::vector - это шаблон динамического массива.
В этой строчке, в частности, создание массива массивов int.
PM   Вверх
Rififi
Дата 30.3.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



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

массив не является указателем на первый элемент а неявно приводится к нему компилятором.
вот пример функцмии, в который передаётся сам массив, без потери информации о типе.

Код

template <size_t N>
void f(int (&a)[N])
{
    std::cout << "в массиве " << sizeof(a) / sizeof(a[0]) << " элементов." << std::endl;
}

int arr[10];
f(arr);

PM MAIL   Вверх
bsa
Дата 31.3.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Rififi, читаем вопрос Dmitriy2k внимательно - речь идет о языке Си
PM   Вверх
Rififi
Дата 31.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



bsa, 
а чего тогда ему советуют вектор?

Для Си кроме отсутствия ссылочного типа ничего не меняется
void f(int (*arr)[10])
{
    printf("%d элементов.\n", sizeof(*arr) / sizeof((*arr)[0]));
}

int arr[10];
FuncArray(&arr);

PM MAIL   Вверх
bsa
Дата 31.3.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Rififi, ты ему предлагаешь передать по указателю, а ему нужно по значению
PM   Вверх
Rififi
Дата 31.3.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



чтобы передать "массив по-значению", нужно чтобы он был lvalue и/или имел конструктор копирования.
а массив, как известно, не является lvalue, зато является POD-типом, следовательно, запрашиваемое в исходном вопросе невозможно.
PM MAIL   Вверх
UnrealMan
Дата 31.3.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Rififi @  31.3.2008,  13:40 Найти цитируемый пост)
чтобы передать "массив по-значению", нужно чтобы он был lvalue и/или имел конструктор копирования.
а массив, как известно, не является lvalue

Это ты где такое вычитал?
PM MAIL   Вверх
Graf_h
Дата 31.3.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: 2
Всего: 5



Цитата(Dmitriy2k @  30.3.2008,  11:29 Найти цитируемый пост)
Подскажите, можно ли передать копию массива в функцию

Это честно говоря глупо smile ! лудше по сonst ссылке smile 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5169 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.