LINUX.ORG.RU

А какой язык умеет так?


0

5

Возврат нескольких значений из функции [псевдокод на С]:


(double, double, int) foo()
{
    double a = 10;
    double b = 15;
    int c = 20;
    
    return (a,b,c);
}

int main(int argc, char** argv)
{
    double x, y;
    int z;

    (x,y,z) = foo();
    
    return 0;
}

P.S. Как сделать подобное в Си я прекрасно знаю. Интересуют языки, которые могут сделать все именно так, как это описано в псевдокоде.

★★★★★

Последнее исправление: trex6 (всего исправлений: 1)

Питон например.

anonymous
()

си умеет так! (псевдокод на русском)

тут структура из трех членов.

возвращаемое_значение_структура имяфункции() {
  посчитали;
  заполнили структуру;
  возвратили структуру"
}

зачем тебе такие извраты, как в ОП?

aol ★★★★★
()

Используй структуры, Люк!

Tanger ★★★★★
()
Ответ на: комментарий от trex6

количество структур на ... конечно

количество возвращаемых типов - тоже.

aol ★★★★★
()

Любой, в котором есть структуры.

И даже в фортране77 можно процедуре передавать параметры для intent out.

aedeph_ ★★
()

Сишечка же

Возвращай (void*), заполненный (a,b,c), а в вызывающей распаковывай. Возьми за пример var_args.

schizoid ★★★
()
Ответ на: комментарий от rival

Как в чем? Скажет «надо же, питон так умеет», и все. =)

По сабжу - С точно умеет, питон вроде тоже. Но об этом уже сказали.

Zhbert ★★★★★
()
Ответ на: комментарий от rival

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

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Ну, я видимо, их и имел ввиду. Просто помню, что вроде на сишечке писал что-то подобное. А как точно - не помню, давно было. Я сишечку не трогал уже с полгода, наверное.

Zhbert ★★★★★
()
Ответ на: комментарий от DeVliegendeHollander

Дополнение

Забыл код самой функции :)

> function ReturnArgs(Arg1, Arg2, Arg3)
>>   return Arg1, Arg2, Arg3
>> end
DeVliegendeHollander ★★
()
Ответ на: комментарий от aol

Лично я нового не посоветую. Разве что можно создать указатели на нужные переменные и передавать их в функцию как параметры, а в ней делать присвоение. Вот ссылка на старую тему:
вернуть Несколько значений из функции в C

ms-dos32
()
Ответ на: комментарий от Zhbert

Си без костылей так не умеет. Возвращаем структуру - одно значение: структура. Возвращаем тапл - снова одно значение. А питон умеет так:

>>> def ololo():
...     return 'a', 'b', 'c'
... 
>>> var1, var2, var3 = ololo()
>>> print var1
a
>>> print var2
b
>>> print var3
c

jessey
()

Lisp.

А вообще любая хрень умеющая tuple.

Svoloch ★★★
()

Python, Ruby, как и почти все остальные развитые скриптовые.

C++ с правильными библиотеками.

Deleted
()
Ответ на: Сишечка же от schizoid
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

#define TUPLE void*
#define PACK(tuple, A, a, B, b, C, c) \
{\
    tuple = malloc(sizeof(a) + sizeof(b) + sizeof(c));\
    TUPLE p = tuple;\
    *((A*)p) = a; p += sizeof(a);\
    *((B*)p) = b; p += sizeof(b);\
    *((C*)p) = c; p += sizeof(c);\
}

#define UNPACK(tuple, A, a, B, b, C, c) \
{ \
    if(tuple) { \
        TUPLE p = tuple; \
        a = *((A*)p); p += sizeof(a); \
        b = *((B*)p); p += sizeof(b); \
        c = *((C*)p); p += sizeof(c); \
        free(tuple); \
        tuple = NULL; \
    } \
}

TUPLE foo() {
    double a = 10;
    double b = 15;
    int c = 20;
    TUPLE tuple = NULL;
    PACK(tuple, double, a, double, b, int, c);
    return tuple;
}

int main(int argc, char** argv)
{   
    double x, y;
    int z;
    
    TUPLE tuple = foo();
    UNPACK(tuple, double, x, double, y, int, z);
    assert(x == 10);
    assert(y == 15);
    assert(z == 20);
    return 0; 
}   
schizoid ★★★
()

Возврат нескольких значений из функции

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

А так — на банальном PHP:

function foo()
{
    return array(1, 2, 3);
}

list($x, $y, $z) = foo();
list($a, $b) = foo(); // так тоже можно
@list($q, $w, $e, $r) = foo(); // и даже так, r будет NULL

В 5.4 уже и без array() можно.

Хотя фиксированный порядок аргументов — зло. Лучше уж тогда так:

function foo()
{
    return array(
        'type' => 'page', 
        'title' => 'cool title',
        'text' => 'some text'
    );
}

extract(foo());

echo "This is $title $type";

На Питоне — само собой.

KRoN73 ★★★★★
()

Короче, судя по треду, проще перечислить языки, которые так НЕ умеют :)

KRoN73 ★★★★★
()

Scala

val (a,b,c) = {() => (1,2,3) } apply()

Функция, возвращающая кортеж.

smap
()
Ответ на: комментарий от schizoid

Тогда уж лучше структуры использовать, нагляднее получится.

trex6 ★★★★★
() автор топика

Не совсем так, но довольно похоже, можно сделать через std::tuple в C++11:

std::tuple<double, double, int> foo()
{
}

только не получится фокус с (x,y,z) = foo(), нужно будет через get<N>() дергать значения

qrck ★★
()
Ответ на: комментарий от Raving_Zealot

C++11, используя класс std::tuple.

Вообще-то ещё C++ c TR1 (std::tr1::tuple).

Begemoth ★★★★★
()
Ответ на: комментарий от qrck

только не получится фокус с (x,y,z) = foo(), нужно будет через get<N>() дергать значения

почти 4.2 - std::tie это этого сделали (понятно, что x, y, z надо будет предварительно объявить).

Begemoth ★★★★★
()
Ответ на: комментарий от Svoloch

Не любой. Положи-ка в жабке в список int и String.

Ну да, теперь ещё надо определить, что такое список :)

Bad_ptr ★★★★★
()

Костылять можно ещё так:

void wtfAmIDoing(int &returnInt, char &returnChar) {
	returnInt  = 0;
	returnChar = '1';
}

int i;
char c;
	
wtfAmIDoing(i, c);
cout << i << ' ' << c << endl;	// 0 1 
Kalashnikov ★★★
()
Ответ на: комментарий от Deleted

Спорный момент. Но это уже совсем другая история.

trex6 ★★★★★
() автор топика

PowerShell возвращает:

 000 > function foo () { $a=15; $b=20; $c=25; return $a, $b, $c}
 001 > foo
 15
 20
 25
 002 > $a
 003 > function foo () { $global:a=15; $global:b=20; $global:c=25; return $a, $b, $c}
 004 > foo
 15
 20
 25
 005 > $a;$b;$c
 15
 20
 25
 006 >

TGZ ★★★★
()
Ответ на: комментарий от trex6

А если так, то C:

void wtfAmIDoing(int *returnInt, char *returnChar) {
	*returnInt  = 0;
	*returnChar = '1';
}

int i;
char c;
	
wtfAmIDoing(i, c);
printf("i = %d, c = %c\n",  i, c);

invy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.