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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат значений из функции 
V
    Опции темы
ioManip
Дата 22.9.2013, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте! Подскажите, как вернуть из функции более одного значения?(при помощи ссылок)
Если можно с примерчиком)
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Фантом
Дата 22.9.2013, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Проще сразу привести примерчик - функцию scanf. Она именно это и делает.
PM   Вверх
akizelokro
Дата 22.9.2013, 19:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Наиболее известный для постSTL'ного поколения С++-программистов пример возврата значения по ссылке - переопределение оператора "<<" в потоках.
Вернуть более одного значения С/C++ не может. Но гибкость языка позволяет решать эту задачу косвенными способами:
-изменять значения объектов, переданных в функцию по указателю или по ссылке
-глобальные переменные
-либо переменные в области видимости (пример - функция-метод класса изменяет значения членов класса-данных
-возвращать объект (юнион, класс, структуру, массив, выделенную область памяти, заполненую и т.д.), либо указатель на подобный объект, либо посредством ссылки на объект.
Так что нужно именно?

Это сообщение отредактировал(а) akizelokro - 22.9.2013, 20:02


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
volatile
Дата 22.9.2013, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  22.9.2013,  06:24 Найти цитируемый пост)
как вернуть из функции более одного значения?

можно еще так, прямо в лоб
Код

struct ret_val {
   ret_val (int v1, int v2) : v1(v1), v2(v2) {} 
   int v1;
   int v2;
};

ret_val my_func ()
{
   return ret_val (7, 13); // возвращаем 2 значения
}

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


Эксперт
****


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

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



Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair
PM MAIL   Вверх
feodorv
Дата 22.9.2013, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(akizelokro @  22.9.2013,  20:31 Найти цитируемый пост)
Так что нужно именно?

Цитата(ioManip @  22.9.2013,  07:24 Найти цитируемый пост)
при помощи ссылок


Код

int func( int& v1, int& v2)
{
  v1 = 1;
  v2 = 2;
  return 0;
}

?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 23.9.2013, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(feodorv @  22.9.2013,  22:23 Найти цитируемый пост)
Цитата(akizelokro @  22.9.2013,  20:31 Найти цитируемый пост)
Так что нужно именно?


Написано, как вернуть из функции. Я и поинтересовался. Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 23.9.2013, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(volatile @  22.9.2013,  22:18 Найти цитируемый пост)
Если именно 2 значения нужно вернуть,  можно обойтись и без определения своей структуры, задействовав std::pair, и make_pair 


Это понятно. Как и то, что до 10 значений в С++11 можно вернуть через std::tuple.
Либо, кажись так (хоть в любом случае, ни std::tuple, ни вариант ниже формально не возвращение нескольких значений по ссылке)

Код

struct ret_val {
   int v1;
   int v2;
};
ret_val& my_func (ret_val & rv)
{
   rv.v1 = 3;
   rv.v2 = 7;
   return rv; // возвращаем 2 значения
}


Но я так и не понял, что именно нужно из самого вопроса.

Это сообщение отредактировал(а) akizelokro - 23.9.2013, 02:36


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ioManip
Дата 23.9.2013, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(akizelokro @  23.9.2013,  02:15 Найти цитируемый пост)
Но я так и не понял, что именно нужно из самого вопроса.

Вот как написано в задании: "Функция должна возвращать несколько значений, для этого использовать ссылки". 

Цитата(akizelokro @  22.9.2013,  19:31 Найти цитируемый пост)
Вернуть более одного значения С/C++ не может.

Я тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам.
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
akizelokro
Дата 23.9.2013, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(ioManip @  23.9.2013,  04:34 Найти цитируемый пост)
 тоже начал с этой мысли, но после этого туман) Поэтому и обращаюсь к Вам. 


Сделай и так, и так одновременно, если там больше ничего нет более подробного (примеров каких-то или дополнительных условий). Передавай два аргумента в функции по ссылке, значения двух из них меняй в функции, а одно из них навроде предложения volatile. Потому что я не думаю, что там говорится о том, чтобы функция возвращала результат-временную переменную, приравнивая её значение константной ссылке навроде.. траляля-тополя.

Вообщем, я тебе ещё больше могу только усложнить, Возвращение значения по ссылке





--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 23.9.2013, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(akizelokro @  23.9.2013,  01:38 Найти цитируемый пост)
Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.

Вы уж больно придираетесь к словам. Всю жизнь говорили о значениях, передаваемых из вызванной функции в вызывающую по ссылке или по адресу, как о возвращаемых значениях, а тут вот нельзя почему-то.
Цитата
Аналогично программа может возвращать только одно значение. Если же логика требует нескольких, некоторые параметры объявляются ссылками, чтобы функция могла непосредственно модифицировать значения соответствующих фактических аргументов и использовать эти параметры для возврата дополнительных значений, либо некоторый класс или контейнер, содержащий группу значений, объявляется типом, возвращаемым функцией.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 23.9.2013, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(feodorv @  23.9.2013,  05:16 Найти цитируемый пост)
Цитата(akizelokro @  23.9.2013,  01:38 Найти цитируемый пост)
Потому что "функция возвращает значение по ссылке" это одно, кажется, а изменяет значение - другое.

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


Я не придираюсь, я просто переспросил. Меня вдруг в памяти что-то торкнуло, что там что-то есть ещё. А дальше мне поставили минус за вроде бы правильно написанный спич и в любом случае, я долго не работал, и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства. 



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 23.9.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(akizelokro @  23.9.2013,  06:34 Найти цитируемый пост)
и заодно узнал(вспомнил) интересную "фенечку", когда функция стоит слева от знака равенства

 smile Это да, когда я впервые познакомился с этим трюком, было приблизительно так, как описано здесь:
Цитата
метод, стоящий слева от знака равенства, обычно повергает человека, читающего код, в пятиминутное шоковое состояние.
 Статья 95-го года, а сейчас-то все с этим трюком знакомы smile 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 23.9.2013, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Ладно, чёрт с ним с минусиком, у меня задачи другие. 

Цитата(feodorv @  23.9.2013,  08:52 Найти цитируемый пост)
 Статья 95-го года, а сейчас-то все с этим трюком знакомы

Я как увидел, заулыбался, вот, думаю, будет забавная шняга  smile 

По поводу вопроса. Я ещё нашёл два источника, в котором как термин фигурирует "возвращение значения по ссылке". Как я понял, это что-то народе вида

Код

ret_val& my_func (ret_val & rv)
или
ret_val& my_func ()

Единственное условие, что время жизни объекта должно быть дольше существования функции (можно возвращать глобальную переменную или параметр, переданный в функцию по ссылке, либо же, возможно, приравнивать возвращаемое значение константной ссылке. Осталось только определить, действительно ли так воспринимает этот термин составитель задачи.


Это сообщение отредактировал(а) akizelokro - 23.9.2013, 16:38


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 24.9.2013, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(akizelokro @  23.9.2013,  17:38 Найти цитируемый пост)
Осталось только определить, действительно ли так воспринимает этот термин составитель задачи.

Думаю, что нет, поскольку не "по ссылке", а
Цитата(ioManip @  22.9.2013,  07:24 Найти цитируемый пост)
при помощи ссылок




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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