Вниз
Скачать: 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.05 c
15-1269552602
Юрий
2010-03-26 00:30
2010.08.27
С днем рождения ! 26 марта 2010 пятница


15-1267488778
Дмитрий
2010-03-02 03:12
2010.08.27
игры на delphi


2-1275239628
Б
2010-05-30 21:13
2010.08.27
Редактор блок-схем.


2-1274676640
viktooor
2010-05-24 08:50
2010.08.27
Запрет редактирование в Grid


2-1272006939
wancuver
2010-04-23 11:15
2010.08.27
Как выполнить поиск в memo правильно..?




   Наверх