Консультация № 108962
11.11.2007, 19:20
0.00 руб.
0 5 5
Можно ли в С++ с помощью функции вернуть два или больше значений (Например как в паскале процедуры). Каким образом это можна сделать. За рание благодарен.

Обсуждение

Неизвестный
11.11.2007, 19:33
общий
это ответ
Здравствуйте, Боднарчук Андрій Васильович!
в C++ два значения функция напрямую возвращать не может. если вам нужно оперировать с какой-то второй переменной, вы можете передать функции указатель на значение этой переменной в качестве аргумента. смотрите в приложении пример на msvc++ 2005

Приложение:
#include "stdafx.h"#include <stdio.h>int myfunc(int *a2){ *a2 = 19; return 13; }void myfunc2(int *a1, int *a2){ *a1 = 14; *a2 = 20;}int _tmain(int argc, _TCHAR* argv[]){ int a1, a2; a1 = myfunc(&a2); printf ("%d, %d\n", a1, a2); myfunc2(&a1, &a2); printf ("%d, %d\n", a1, a2);}
Неизвестный
11.11.2007, 19:41
общий
это ответ
Здравствуйте, Боднарчук Андрій Васильович!
Ну вообще не помнится, что бы в паскале можно было возвращать больше двух значений) Тем более, если это процедура, а не функция =)
Далее, как промежуточный вариант, думаю, что можно вернуть результат работыы в параметре ф-ции, тогда тут два варианта:

1.
void FuncReturn(int *pInt)
{
*pInt=2;
};

int main()
{
int i=0;
FuncReturn(&i); //Теперь i==2
};

2. С помощью неявных укащателей:

void FuncReturn(int &OutValue)
{
OutValue=5;
};

int main()
{
int iTest=0;
FuncReturn(iTest); //Теперь iTest==5
};
Неизвестный
11.11.2007, 19:46
общий
это ответ
Здравствуйте, Боднарчук Андрій Васильович!
Ф-ции в с/с++ могу возвращать только одно значение. Но, этим значением может быть и структура и класс -> вернётся тот объём данных, который вам нужен. В приложении показано как возвращается структура содержащая две переменные.

Приложение:
struct tmp{ int a; double b;};tmp f(){ tmp rez; rez.a=10; rez.b=1.; return rez;};
Неизвестный
11.11.2007, 19:48
общий
это ответ
Здравствуйте, Боднарчук Андрій Васильович!
При переходе с Pascal, неприятно узнать, что в Си нет процедур, однако на деле способ передачи данных в Си очень похож на паскалевский:
Передача параметров по ссылке. Ссылочный параметр – это псевдоним соответствующего аргумента. Для указания, что параметр передается по ссылке, после параметра стравится символ “&”. Например:
void fun2(double &, int &); // Прототип
Вызов такой функции осуществляется:
fun2(d,r);
При таком вызове передается не переменная, а ее адрес, полученный с использованием операции “взять адрес”. Следовательно, при обращении к временной переменной в действительности происходит обращение к исходной переменной в вызывающей функции.
Передача параметров по указателю.
В отличии от передачи по ссылке адрес переменной передается в функцию не с использованием операции разадресации (&), а операцией косвенной адресации (*). В результате передается не сама переменная, а указатель на нее. Например:
void fun3(double *, int *); // Прототип
Вызов такой функции осуществляется:
fun3(&f,&k);
Здесь тоже все изменения, происходящие внутри функции приводят к изменению пременных в вызывающей программе.
В Паскале все это пришется с использованием var в описании формальных параметров.

Неизвестный
12.11.2007, 04:34
общий
это ответ
Здравствуйте, Боднарчук Андрій Васильович!
Функция ВСЕГДА возвращает одно значение. В том числе и в Паскале. Однако возвращаемое значение не обязательно должно быть скалярной величиной.
Но, судя по вопросу, Вас интересует как в Си сделать нечто вроде паскалевского параметра-переменной?

В Си (а равно С++) аргументы функций всегда передаются по значению. Для того, что бы можно было через параметры ВЕРНУТЬ значение, или несколько значений, параметры должены быть указателями на переменные, существующие в вызывающем коде.

Тему указателей довольно обширна, но ничего особо хитрого. Пример в приложении.

Приложение:
include <stdio.h>void my_func(int, int *, int *);int main(void){int c, d; my_func(10, &c, &d); printf("%d %d", c, d); getchar(); // ожидаем нажатия Enter для выхода из программы return 0;}void my_func(int x, int *a, int *b) //вопрос 108962{ *a = x + 1; *b = x + 2;}
Форма ответа