powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедурный тип - наличие функции
15 сообщений из 15, страница 1 из 1
Процедурный тип - наличие функции
    #40135016
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Type 
  myFunc = function: string;
end;

var
  mf: myFunc;

...

function getString: string;

...

mf := getString; //Надо проверить этот факт :)

...



Корректна ли такая проверка?

Код: pascal
1.
2.
if assigned(mf) then 
  s:=mf;
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135027
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox, думаешь у тебя проц взорвется, если ты сам скомпилируешь и проверишь?
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135042
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, я проверил и оно работает, но может есть какие-то более популярные конструкции :)
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135047
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
{$APPTYPE CONSOLE}

program IsAssigned;

uses
  SysUtils;

type
  tFunction = function: string;

function GetString: string;
begin
  Result := 'Function result';
end;

var
  fFunction: tFunction;

begin
  try
    fFunction := nil;        // <-- это для предотвращения фантомных болей

    fFunction := GetString;

    if @fFunction <> nil then
      Writeln(fFunction)

    else
      Writeln('Function not assigned');

  except
    on gError: Exception do
      Writeln(gError.Classname, ': ', gError.Message);

  end;  
end.
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135050
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC
antox,

Код: pascal
1.
fFunction := nil;        // <-- это для предотвращения фантомных болей



Т.е. если не записать nil и вообще ничего не записать, то в fFunction может оказаться что-то другое?
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135053
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox, если отключить оптимизацию и поставить бряк на try, то в Watch List`е видно, что @fFunction всегда nil. Но в писании сказано: "Всегда инициализируй переменные [в конструкторе]!" (с)
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135058
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC,

Спасибо
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40135152
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Корректна ли такая проверка?
Код: pascal
1.
2.
if assigned(mf) then 
  s:=mf;

Да. Более того - единственно правильная
antox
Т.е. если не записать nil и вообще ничего не записать, то в fFunction может оказаться что-то другое?
Если это локальная переменная, то там может быть любой мусор. Если глобальная или поле класса, то там гарантированный nil
LocksmithPC
Код: pascal
1.
if @fFunction <> nil then

Не помню деталей, но в каких-то случаях такая конструкция дает сбой. Assigned() работает всегда. И на функциях, и на методах, и на анонимных функциях. Конструкция @func имеет право на жизнь только в одном единственном случае - при вызове GetProcAddress
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136652
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, как-то так
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136661
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне конструкция @funcname <> nil кажется неестественной. Если есть переменная, как указатель на нее м.б. nil? Нелогично. Понятно, что это такое условие в языке, чтобы отличить взятие адреса от вызова, но выглядит оно не очень
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136823
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, "@" & "Addr" это с TP 5.0 тянется, ЕМНИП. Или еще с какой древней версии. А может с рождения.

"Addr(fFunction)" дает ту же конструкцию, к слову
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136840
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LocksmithPC
Fr0sT-Brutal, "@" & "Addr" это с TP 5.0 тянется, ЕМНИП. Или еще с какой древней версии. А может с рождения.

"Addr(fFunction)" дает ту же конструкцию, к слову

Ну Addr еще более устаревшая конструкция, но в этом случае она как-то чуть более логична. И все равно Assigned намного лучше
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136847
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, если в данном случае они все генерят одинаковый asm код, то лучше она только тем, что в будущем могут отказаться от "@" & "Addr", если мы доживем до этого :)

Надо смотреть какой код будет при операции с классами: if @class <> nil then & if Addr(class) <> nil then & if Assigned(class) then, но мне лениво :)
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136864
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да по времени и коду вряд ли что-то будет различаться, просто Assigned более естественно выглядит и воспринимается. "Присвоена ли переменная", без всяческих адресов и указателей
...
Рейтинг: 0 / 0
Процедурный тип - наличие функции
    #40136865
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Assigned более естественно выглядит и воспринимается.
+100500!

и сопровождать проще.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедурный тип - наличие функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]