Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
12th
Апр
Как узнать возвращается ли чему либо результат из функции?
Posted by maloy under Delphi, Архив
Stilet
Встал нетривиальный вопрос:
Есть функция:
function aga:string;
begin
result:='kuku';
end;
...
bbr:=aga;
А ведь можно написать и просто aga, тогда возвращаться ничего не будет.
Так вот вопрос:
Как мне в функции узнать будет ли возвращать она в какое нить выражение или просто выполняться?
И если результат никуда не возвращается выполнить некое действие, например присвоить некой внутренней переменной тот результ дабы не пропал.
alexBlack
Только если локальная переменная, которой затем присваивается результат функции, до вызова уже содержала какую-то строку. Дело в том, что на момент вызова result — ссылка на локальную переменную и значение не очищается, т.е. по сути вызов эквивалентен передаче var-параметра. Если же вызов идет «без возврата значения», компилятор подставляет временную локальную переменную.
var isReturn : boolean;
function GetString : String;
begin
isReturn := length(result) <> 0;
result := 'test';
end;
procedure test;
var S, S1:String;
begin
S := 'yttt'; // Если же S := '', определить нельзя
S := GetString;
writeln(isReturn, S);
S := GetString;
writeln(isReturn, S);
GetString;
writeln(isReturn, S);
end;
begin
test;
readln;
end.
JTG
Внутри функции — нельзя, её код не зависит от того, вызвали её как функцию или как процедуру.
function aga1:string;
begin
result:='kuku1';
end;
0044F0A8 /$ 53 PUSH EBX ; aga1
0044F0A9 |. 8BD8 MOV EBX, EAX
0044F0AB |. 8BC3 MOV EAX, EBX
0044F0AD |. BA C4F04400 MOV EDX, Project1.0044F0C4 ; ASCII "kuku1"
0044F0B2 |. E8 8D54FBFF CALL Project1.00404544
0044F0B7 |. 5B POP EBX
0044F0B8 \. C3 RETN
function aga2:string;
begin
result:='kuku2';
end;
0044F0CC /$ 53 PUSH EBX ; aga2
0044F0CD |. 8BD8 MOV EBX, EAX
0044F0CF |. 8BC3 MOV EAX, EBX
0044F0D1 |. BA E8F04400 MOV EDX, Project1.0044F0E8 ; ASCII "kuku2"
0044F0D6 |. E8 6954FBFF CALL Project1.00404544
0044F0DB |. 5B POP EBX
0044F0DC \. C3 RETN
procedure TForm1.Button1Click(Sender: TObject);
begin
aga1;
end;
0044F0F0 >/. 55 PUSH EBP ; Button1Click
0044F0F1 |. 8BEC MOV EBP, ESP
0044F0F3 |. 6A 00 PUSH 0
0044F0F5 |. 33C0 XOR EAX, EAX
0044F0F7 |. 55 PUSH EBP
0044F0F8 |. 68 21F14400 PUSH Project1.0044F121
0044F0FD |. 64:FF30 PUSH [DWORD FS:EAX]
0044F100 |. 64:8920 MOV [FS:EAX], ESP
0044F103 |. 8D45 FC LEA EAX, [LOCAL.1]
0044F106 |. E8 9DFFFFFF CALL Project1.0044F0A8 ; aga1
0044F10B |. 33C0 XOR EAX, EAX
0044F10D |. 5A POP EDX
0044F10E |. 59 POP ECX
0044F10F |. 59 POP ECX
0044F110 |. 64:8910 MOV [FS:EAX], EDX
0044F113 |. 68 28F14400 PUSH Project1.0044F128
0044F118 |> 8D45 FC LEA EAX, [LOCAL.1]
0044F11B |. E8 D053FBFF CALL Project1.004044F0
0044F120 \. C3 RETN
procedure TForm1.Button2Click(Sender: TObject);
begin
bbr := aga2;
end;
0044F12C >/. 55 PUSH EBP ; Button2Click
0044F12D |. 8BEC MOV EBP, ESP
0044F12F |. 6A 00 PUSH 0
0044F131 |. 33C0 XOR EAX, EAX
0044F133 |. 55 PUSH EBP
0044F134 |. 68 6AF14400 PUSH Project1.0044F16A
0044F139 |. 64:FF30 PUSH [DWORD FS:EAX]
0044F13C |. 64:8920 MOV [FS:EAX], ESP
0044F13F |. 8D45 FC LEA EAX, [LOCAL.1]
0044F142 |. E8 85FFFFFF CALL Project1.0044F0CC ; aga2
0044F147 |. 8B55 FC MOV EDX, [LOCAL.1]
0044F14A |. B8 D42B4500 MOV EAX, Project1.00452BD4
0044F14F |. E8 F053FBFF CALL Project1.00404544 ; LStrAsg
0044F154 |. 33C0 XOR EAX, EAX
0044F156 |. 5A POP EDX
0044F157 |. 59 POP ECX
0044F158 |. 59 POP ECX
0044F159 |. 64:8910 MOV [FS:EAX], EDX
0044F15C |. 68 71F14400 PUSH Project1.0044F171
0044F161 |> 8D45 FC LEA EAX, [LOCAL.1]
0044F164 |. E8 8753FBFF CALL Project1.004044F0
0044F169 \. C3 RETN
Можно конечно в начале функции взять со стека адрес возврата и проанализировать код вокруг него, но это же изврат
тема на форуме от 2009 года
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)