Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.065 c
15-1269450731
GDI+
2010-03-24 20:12
2010.08.27
Формула рассчета расстояния между двумя точками на сфероиде


2-1270711682
12
2010-04-08 11:28
2010.08.27
MSSQL, номер записи в select


15-1272832202
Юрий
2010-05-03 00:30
2010.08.27
С днем рождения ! 3 мая 2010 понедельник


2-1267982007
NBAH1990
2010-03-07 20:13
2010.08.27
Ошибка при передачи данных по TCP протоколу


2-1266495492
NewGuest
2010-02-18 15:18
2010.08.27
Удаление компонентов в Run-Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский