Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2009, 11:29   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Как узнать возвращается ли чему либо результат из функции?

Встал нетривиальный вопрос:
Есть функция:
Код:
function aga:string;
begin
 result:='kuku';
end;
...
bbr:=aga;
А ведь можно написать и просто aga, тогда возвращаться ничего не будет.
Так вот вопрос:

Как мне в функции узнать будет ли возвращать она в какое нить выражение или просто выполняться?
И если результат никуда не возвращается выполнить некое действие, например присвоить некой внутренней переменной тот результ дабы не пропал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 11:56   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Только если локальная переменная, которой затем присваивается результат функции, до вызова уже содержала какую-то строку. Дело в том, что на момент вызова 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.
alexBlack вне форума Ответить с цитированием
Старый 07.10.2009, 12:23   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
S := 'yttt'; // Если же S := '', определить нельзя
Хы... Намек понял, но это м.м.м мне не очень удобно так инициализировать, как правило инициализирую я именно 0 или ''.
При этом это ведь проверка мусора в памяти )
не-е-е так не надежно.
Я думал мож какая директива есть...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 13:19   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Внутри функции - нельзя, её код не зависит от того, вызвали её как функцию или как процедуру.
Код:
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
Можно конечно в начале функции взять со стека адрес возврата и проанализировать код вокруг него, но это же изврат
пыщь
JTG вне форума Ответить с цитированием
Старый 07.10.2009, 14:02   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но это же изврат
Ессно. Лана. забыли...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 16:22   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Сделай над функцией обертку
Код:
procedure Ogo(var rez: String);
begin
         rez:=aga;
end;
Тогда результат будет всегда сохранен .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.10.2009, 16:38   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
Сделай над функцией обертку
Не удобно, так ее в выражения не поставишь без лишней переменки...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 16:45   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

В выражениях функция, где боишься за результат процедура.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли использовать новую форму только дря хранения какого-либо(каких-либо) класса? TwiX Общие вопросы Delphi 8 03.10.2009 11:06
Как узнать что в содержимое буфера обмена добавилось что либо? zotox Общие вопросы Delphi 2 15.09.2009 12:07
Задача на Vba либо C++ либо Паскале Fraerrrrr Помощь студентам 3 27.05.2009 15:30
Математика. Получить параметр функции зная результат Stilet Общие вопросы по программированию, компьютерный форум 2 06.03.2009 08:51
как обращатся к чему либо WOLFak Общие вопросы Delphi 3 13.02.2008 06:06