Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.046 c
2-1270201928
Boortwint
2010-04-02 13:52
2010.08.27
Компоненты TOpenDialog и TSaveDialog


15-1271881805
Юрий
2010-04-22 00:30
2010.08.27
С днем рождения ! 22 апреля 2010 четверг


2-1267973309
New-zzzz
2010-03-07 17:48
2010.08.27
Как запустить и работать с этим-же внешним приложением?


4-1235478756
EgorovAlex
2009-02-24 15:32
2010.08.27
Можно ли передавать из одного потока в другой хендл открытого


2-1273738117
9x3bk
2010-05-13 12:08
2010.08.27
Работа с совмещением картинок




   Наверх