Что, если функция должна возвращать 2 значения?

Тема в разделе "WASM.BEGINNERS", создана пользователем Luna, 3 май 2010.

  1. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Имеется программа по вычислению периметра многоугольника, содержащая функцию по вычислению координат точек пересечения сторон. Что записать после return в этой функции, ведь она должна возвращать 2 массива координат (про х и по у)?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Язык бы что-ли написали. ^) А вообще можно возвращать структуру.
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Luna
    ты можешь предавать адрес на структуру а твоя функция будет ее заполнять
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    соответственно после ретурн ничего не нужно
     
  5. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Booster
    Да нет, это задача не требует таких новоротов и должна иметь наипростейшее решение

    Rockphorr

    Собственно так сначала и делала, и координаты выводились на экран. Но после этого программа уже не работает, так как нечего передать в качестве фактических параметров в функцию по подсчёту длин сторон многоугольника.
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Luna
    что случилось, почему?
     
  7. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Rockphorr

    Хотя время лечит, так что теперь программа работает в полную силу)Удивительно только получилось: функция выводит на экран 2 координаты, а возвращает одну- и все последущие функции работают.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Luna
    вы бы код выложили а то как то мутно все - проблемы какие-то надуманные вперемешку с хромой терминологией
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1. struct Point {int x, y;};
    2. Point foo()
    3. {
    4.     Point pt = {1, 2};
    5.     return pt;
    6. }
    или

    Код (Text):
    1. std::pair<int, int> foo()
    2. {
    3.     return std::pair<int, int>(1, 2);
    4. }
     
  10. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Rockphorr
    Уж и Вам спасибо за отличный совет, но ,боюсь, долговато будет с DOS-го компилятора код переписывать.

    GoldFinch
    ах вот как)- спасиббо)))
     
  11. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Luna
    а так не хотите?

    int foo(int *x, int *y)
    {
    if (x) *x = ... ;
    if (y) *y = ...;

    if (косяк) return err;

    return ok;

    }

    а еще можно так:

    uint foo()
    {
    return x*100h + y;
    }

    тут правда нужно за разрядностью следить. но зато это самый быстрый способ :) возвращение структур или аргументы по указателю - торррмоза
     
  12. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    typedef struct {int a; int b; /* ... */} dbl_int_out_t;

    dbl_int_out_t
    foo(int a){
    dbl_int_out_t res = {a * 2, a* 18};
    return res;
    }

    main(){
    dbl_int_out_t res;
    res = foo(4);
    }


    2 int мсвс выкидывает в регистрах. больше - в локальной (стековой) структуре. тормоза возникают если выделять/удалять ее из хипа. правда, я не совсем понял почему оно делает именно так

    00401046 push 4
    00401048 lea eax,[ebp-20h]
    0040104B push eax ; передаем ссылку на структуру для возврата
    0040104C call 00401000
    00401051 add esp,8
    00401054 mov ecx,dword ptr [eax] ; переписываем поля из возвращенной структуры
    00401056 mov dword ptr [ebp-0Ch],ecx ; в переменную
    00401059 mov edx,dword ptr [eax+4] ; но и то, и то ведь локальны для вызывающей функи
    0040105C mov dword ptr [ebp-8],edx ; то ли тут есть чтото, чего я не догоняю,
    0040105F mov eax,dword ptr [eax+8] ; то ли мсвс оптимайзер хуже, чем думалось
    00401062 mov dword ptr [ebp-4],eax
     
  13. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Луна, выходит что ты уж очень начинающая програмисса...
    И чего рокфор в вас такого уж нашел.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kaspersky
    Отчего же торррмоза?
     
  15. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Великий хацкер ничего не путает? Указатели вроде должны быть быстрее всего, поскоку сам объект не дублируется в стык.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А юзание стека уже само по себе тормоз?
     
  17. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    все зависит от того, как выделяется/удаляется объект для возврата. в том числе и неявно. обращение к куче очень медленная операция. пробегитесь по механике вызова отладчиком. а если еще и страницу новую придется выделять ядром..
    нет. особенно, если участок влез в кэш первого уровня.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    qqwe
    Вряд ли структура из двух полей стоит того, чтобы задумываться о механике.

    Полагаю два инта влезут.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qqwe
    Исполнение кода с EFlags.IF = 1 само по себе тормоз и стек тут не причём.
     
  20. JhanGhuangxi

    JhanGhuangxi New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    31
    Luna
    А использовать ключевое слово "__out" при передаче параметров нельзя?