Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Из любопытства: как функция возвращает значение?   Найти похожие ветки 

 
TStas   (2010-02-12 15:30) [0]

Как подпрограмма принимает параметры, мне уже объяснили. При вызове их кладёт в стек, а адресация локальных переменных относительная. Результат функции - это локальная переменная. А как она копируется в переменную, которой он присваивается? Пробовал читать ассемблерный код, которые Дельфи написали, но ничего не понял.


 
KilkennyCat ©   (2010-02-12 15:34) [1]

Пробовал читать сабж, но ничего не понял.


 
Dimka Maslov ©   (2010-02-12 15:41) [2]

в справке популярно расписано как функция возвращает значение. Либо через eax (для целых и указателей), личбо через вершину стека сопроцессора (для вещественных). Записи и массивы формируются в стеке вызывающей подпрограммой и в вызываемую функцию передаётся адрес в качестве неявного параметра. Сама функция при этом реально ничего не возвращает. Результат же функции копируется в переменную при помощи инструкций mov, rep movsx или fstp.


 
Сергей М. ©   (2010-02-12 19:43) [3]


> TStas   (12.02.10 15:30)  


> При вызове их кладёт в стек


Не кладет.
Или кладет, но не все.
А может и все.
Все зависит от конкретного соглашения о вызове (курить F1 + calling convention)


> Результат функции - это локальная переменная


Не обязательно.


 
Григорьев Антон ©   (2010-02-13 09:57) [4]

Если функция возвращает значение сложного типа (строка, запись, массив и т.п.), то с её точки зрения результат - это дополнительный параметр-переменная, т.е. описание
function SomeFunc(...): TSomeType;
эквивалентно
procedure SomeFunc(..., var Result: TSomeType);
Компилятор в каждом конкретном случае сам решает, на что будет ссылаться этот параметр. Если ничего подходящего нет, то, как сказал Dimka Maslov, временная переменная может быть создана в стеке. Но если подходящая переменная есть, то ссылка будет на неё. Вот, например, такой код:

function TestFunc: string;
begin
 ShowMessage(Result)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 S: string;
begin
 S := "Это переменная S";
 S := TestFunc
end;


выведет надпись "Это переменная S", т.е. на момент вызова TestFunc её Result указывает на S.


 
TStas   (2010-02-17 17:02) [5]

>Григорьев Антон Спасибо большое. Вы уже на второй мой вопрос ответили. И книга ваша мне очень понравилась. :)


 
KSergey ©   (2010-02-17 17:17) [6]

> TStas   (17.02.10 17:02) [5]

А остальным нет?
я бы на их месте расстроился, если не сказать хуже.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
15-1263829418
TStas
2010-01-18 18:43
2010.08.27
А куда пропало "Показать мои вопросы"


15-1274387389
Юрий
2010-05-21 00:29
2010.08.27
С днем рождения ! 21 мая 2010 пятница


2-1275324257
И. Павел
2010-05-31 20:44
2010.08.27
Может ли нарушиться Z-последовательность окон?


11-1215989987
Freeman
2008-07-14 02:59
2010.08.27
KOL Format/wvsprintf performance hit


15-1270049066
Чайник
2010-03-31 19:24
2010.08.27
Сколько на самом деле человек вКонтакте?