Главная страница
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.046 c
15-1264203683
Petr V. Abramov
2010-01-23 02:41
2010.08.27
пятничный паровоз :)


15-1264411731
KilkennyCat
2010-01-25 12:28
2010.08.27
Нет ли у кого в Питере ненужного сломанного принтера


4-1234818468
istok
2009-02-17 00:07
2010.08.27
проблема с CoShellWindows


2-1271995058
MAX_76
2010-04-23 07:57
2010.08.27
Помогите решить задачу -запуск Делфи-приложения с саита


2-1275838875
zlodey
2010-06-06 19:41
2010.08.27
регистрация com сервера