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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2012, 16:32   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию Как работать с возвращенным множеством?

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

Код:
int entering()
{
.....
cin >> a;
cin >> b;
cin >> c;
.....
return a,b,c;
}
к примеру так?
Код:
int main()
{
......
entering(a);
entering(b);
entering(c);
......
//и дальше включать в работу?
for(int i = 0; i < a; i++)
      b += c;
......
}
А то чего-то получается, что функция значения то возвращает(компиль не ругается), но вот в майне их он не видет.
L6go1as вне форума Ответить с цитированием
Старый 03.01.2012, 16:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

возвращаете вы не множество а лишь последнюю переменную.

может вам применить массив?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.01.2012, 16:53   #3
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Может, я просто думал что если перечислить переменные, то они все и возвратяться )
Спс, за совет, учту.
L6go1as вне форума Ответить с цитированием
Старый 03.01.2012, 16:54   #4
CaHb4ec
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 25
По умолчанию

привет.
Цитата:
return a,b,c;
на сколько я знаю (поправьте, если не так) return возвращает только что-то одно. Три переменных нереально. Если хотите три переменных вернуть, то создайте массив в entering(), запишите необходимые значения как элементы массива, а в main возвратите указатель на этот массив.
Цитата:
int entering()
без параметров, а вызов
Цитата:
entering(c);
с параметрами. что-то не понятно...
и последнее,
Цитата:
entering(a);
выполняет функцию, но результат не куда не записывает.
CaHb4ec вне форума Ответить с цитированием
Старый 03.01.2012, 18:01   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от CaHb4ec Посмотреть сообщение
привет.

на сколько я знаю (поправьте, если не так) return возвращает только что-то одно.

Тут дело не в том, что return возвращает только что-то одно.
А дело в том, почему вообще такой код компилируется, и что возвращается на самом деле?


На самом деле, символ "," в исходном коде на с++ это полноценный оператор. Вот такой вот не очевидный факт.

И как и у всех прочих операторов, поведение оператор "запятая" прописано в стандарте.

Смысл оператора запятой заключается в следующем: "результатом вычисления выражения будет являться результат вычислений последнего
выражения стоящего в самой правой части вычисляемых выражений".

Пример на всевдокоде:
(a,b); //все что в скобках - это выражение, результат которого нужно
//вычислить и подставить вместо скобочек

Оператор "запятая" говорит компилятору, что в качестве результата выражения подставить нужно результат выражения b


Пример на настоящем коде:

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

Код:
#include <time.h>

int StarterRand(){  srand(  (size_t)  time(NULL));   return 0; }
int random(int least, int greatest)
{
    static int seed(  StarterRand()  ); 
    return rand() % (greatest - least) + least;
}
Что бы не нужно было каждый раз заводить генератор в ручную, а автоматизировать этот момент, была нужна статическая переменная.
Она иницилизурется нулём, и одновременно срабатывает функция srand(), что и приводит с настоящей инициализации seed рандома.

Но сама по себе srand() возвращает void, а статик переменную нужно инициализировать чем то существенным. Поэтому и пришлось завести вторую функцию, которая запустит srand, и в то же время вернёт ноль, позволив seed проинициализироваться.

Теперь все тоже самое, только с помощью оператор "запятая"
Пример наглядно демонстиррует, как с помощью запятой можно угробить читабельность кода, но при этом появляется возможность запихивать в одно предложение сколько угодно "левых" действий:

Код:
int random(int least, int greatest)
{
    static int seed(  (srand(  (size_t)time(NULL)  ), 0)  );     
    //static int seed(  StarterRand()  ); 
    return rand() % (greatest - least) + least;
}
Выражение было заключено в скобки, что бы указать компилятору явно, результат какого выражения будит являться значением, с помощью которого будет инициализирована seed

А в скобках получается: (srand( (size_t)time(NULL) ), 0)

Сначала выполнится все, что до запятой: srand( (size_t)time(NULL) )

А потом, благодаря свойству оператора "запятая", результатом выражения все равно окажется то, что после запятой - то бишь, нолик.

Таким образом, используя оператор "запятая", можно в одно предложение запихивать несколько действий, и манипулировать типами возвращаемых значений.


Ну или вот ещё простой пример:

Код:
int foo()
{
    int a;
    return (a=10, a*=a);  //сначала а =10, потом а =100, результатом выражания будет 100
}

Последний раз редактировалось _Bers; 03.01.2012 в 18:12.
_Bers вне форума Ответить с цитированием
Старый 03.01.2012, 23:49   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

L6go1as

Все значения нужно вернуть в майн, что бы дальше с ними работать, но вот как с ними работать?

Код:
std::tuple<int, int, int> entering()
{
   int a, b, c;
   ...
   return std::make_tuple(a, b, c);
}
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание с массивами и множеством Mr_sniper Паскаль, Turbo Pascal, PascalABC.NET 3 04.10.2011 10:55
Программа с множеством подпрограмм. Pushin Общие вопросы Delphi 8 15.05.2011 15:24
MySQL сравнение множества с множеством. vedro-compota SQL, базы данных 6 31.01.2011 14:05
Помогите разобраться с множеством albatros Общие вопросы Delphi 2 22.02.2009 15:33
Проблемы с одним клиентом и множеством серверов Maxxon Работа с сетью в Delphi 5 28.08.2007 17:27