Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Процедурный тип - наличие функции / 15 сообщений из 15, страница 1 из 1
18.02.2022, 05:17
    #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
18.02.2022, 06:57
    #40135027
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
antox, думаешь у тебя проц взорвется, если ты сам скомпилируешь и проверишь?
...
Рейтинг: 0 / 0
18.02.2022, 08:33
    #40135042
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
Не, я проверил и оно работает, но может есть какие-то более популярные конструкции :)
...
Рейтинг: 0 / 0
18.02.2022, 08:48
    #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
18.02.2022, 08:53
    #40135050
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
LocksmithPC
antox,

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



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

Спасибо
...
Рейтинг: 0 / 0
18.02.2022, 14:26
    #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
28.02.2022, 09:00
    #40136652
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
_Vasilisk_, как-то так
...
Рейтинг: 0 / 0
28.02.2022, 10:54
    #40136661
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
Мне конструкция @funcname <> nil кажется неестественной. Если есть переменная, как указатель на нее м.б. nil? Нелогично. Понятно, что это такое условие в языке, чтобы отличить взятие адреса от вызова, но выглядит оно не очень
...
Рейтинг: 0 / 0
01.03.2022, 06:36
    #40136823
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедурный тип - наличие функции
Fr0sT-Brutal, "@" & "Addr" это с TP 5.0 тянется, ЕМНИП. Или еще с какой древней версии. А может с рождения.

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

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

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

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

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


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