Форум: "Прочее";
Текущий архив: 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.058 c