powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi 6: сравнить указатель на функцию с nil.
21 сообщений из 21, страница 1 из 1
Delphi 6: сравнить указатель на функцию с nil.
    #34552505
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа под Delphi 6.
Имеется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type
	TTimerRequirement = function: boolean of object;

....
	TSimulationTimer = class
	protected
		requirement: TTimerRequirement;
....
		function passRequirement: boolean;
	end;

....

function TSimulationTimer.passRequirement: boolean;
begin
	result := true;
	if (self.requirement <> nil) then
		result := requirement;
end;
В строке "if (self.requirement <> nil) then" компилятор ругается на "incompatible types". Очевидно, он пытается сравнить с nil результат функции вместо самой переменной. Возможно ли указать, что мне нужно сравнить с nil именно переменную, содержащую функцию, а не результат этой функции? Присваивание nil по умолчанию (при передаче типа в параметрах функции) для этого типа работает....

ЗЫ. Я в курсе, что можно сделать "TTimerRequirement = procedure(var b: boolean) of object;".
Интересует, можно ли именно указанный мной вариант разрулить...
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34552557
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разобрался. Надо было
Код: plaintext
1.
2.
3.
4.
5.
6.
function TSimulationTimer.passRequirement: boolean;
begin
	result := true;
	if Assigned(requirement) then
		result := requirement;
end;
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34554519
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVразобрался. Надо было
Код: plaintext
1.
2.
3.
4.
5.
6.
function TSimulationTimer.passRequirement: boolean;
begin
	result := true;
	if Assigned(requirement) then
		result := requirement;
end;

Код: plaintext
1.
result :=  not  Assigned ( requirement )  or  requirement ;
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555479
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerresult := not Assigned ( requirement ) or requirement ;[/src]
Жестоко людям советовать код, работоспособность которого зависит от настроек компилятора.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555660
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADЖестоко людям советовать код, работоспособность которого зависит от настроек компилятора.
Фраза формально верна, но с ее сутью я в данном случае не соглашусь. Сами по себе подобные настройки - огромное зло и головотяпство. Это относится и к ряду дельфовых переключателей, и ко многим другим продуктам. Наличие такой настройки фактически означает отсутствие у идеологов продукта.... затруднюсь подобрать подходящее слово, есть такая идиома - "политическая воля", так вот, отсутствие "неполитической политической воли".

Дык вот, с моей точки зрения, все - даже не "все нормальные люди", а "практически все" - по факту давным-давно согласны о том, какие значения этих настроек "стандартны", и если вдруг где-то по каким-то соображениям решают от них отступить - знают об этом, пишут пять предупреждений вокруг итп. Если сегодня найдется человек, у которого стоит {$B+} или, допустим, {$H-}, и он об этом не помнит и не знает - это исключительно его проблема, можно вполне смело утверждать, что практически любой чужой код заметной длины - включая нестандартные компоненты (и стандартные, кстати, тоже) у него корректно не заработает.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555691
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> result := not Assigned ( requirement ) or requirement ;
EAccessViolation может быть.

Для работы такого надо (если не ошибаюсь), чтобы были включены быстрые
булевские вычисления и то я бы 100% гарантии не дал (на любой версии дельфи
версии), что при обработке строки, если (requirement = nil) не будет
произведена попытка вызова requirement.

Плюс это попросили помочь с мелким заданием, так что не вижу смысла человека
ещё и ключами компилятора заморачивать, ибо ему во всем остальном ещё
ковыряться и ковыряться. :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555721
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer LordMADЖестоко людям советовать код, работоспособность которого зависит от настроек компилятора.
Фраза формально верна, но с ее сутью я в данном случае не соглашусь. Сами по себе подобные настройки - огромное зло и головотяпство. Это относится и к ряду дельфовых переключателей, и ко многим другим продуктам. Наличие такой настройки фактически означает отсутствие у идеологов продукта.... затруднюсь подобрать подходящее слово, есть такая идиома - "политическая воля", так вот, отсутствие "неполитической политической воли".

Дык вот, с моей точки зрения, все - даже не "все нормальные люди", а "практически все" - по факту давным-давно согласны о том, какие значения этих настроек "стандартны", и если вдруг где-то по каким-то соображениям решают от них отступить - знают об этом, пишут пять предупреждений вокруг итп. Если сегодня найдется человек, у которого стоит {$B+} или, допустим, {$H-}, и он об этом не помнит и не знает - это исключительно его проблема, можно вполне смело утверждать, что практически любой чужой код заметной длины - включая нестандартные компоненты (и стандартные, кстати, тоже) у него корректно не заработает.
Дело в другом, можно просто ошибочно после какого-то куска кода, в котором {$B+}, забыть его отменить {$B-}, ведь бывают случаи, когда в результате анализа производительности кода имеет смысл поставить {$B+}.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555835
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADДело в другом, можно просто ошибочно после какого-то куска кода, в котором {$B+}, забыть его отменить {$B-},
В первую очередь, я не вижу практического смысла в наличии таких ключей в коде вообще. Но в любом случае обоснование довольно странное - этак можно и сказать, мол, "перед посоветованным кодом я поставил begin, а после - забыл поставить end, так вот, он почему-то не работает".

Скажу так: я приму точку зрения "там, где все равно, лучше писать код, не зависящий от подобных деталей". Но с моей точки здесь не все равно, здесь речь идет о том, что мысль может быть выражена четко и лаконично, а может - более косноязычно, вплоть до откровенного заикания в духе

Код: plaintext
 if  a = true  then  b := true  else  b := false ;

C моей точки зрения, эта разница - важнее, хотя безусловно, вопрос вкусов.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555880
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВ первую очередь, я не вижу практического смысла в наличии таких ключей в коде вообще.Я уже привел пример - это увеличение производительности.
softwarerНо в любом случае обоснование довольно странное - этак можно и сказать, мол, "перед посоветованным кодом я поставил begin, а после - забыл поставить end, так вот, он почему-то не работает".Я бы согласился, если бы отсутствие выключения ключа приводило бы к ошибке/предупреждению/хинту на этапе компиляции.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555910
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADЯ уже привел пример - это увеличение производительности.
Я помню и отвечаю с учетом этого.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555950
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVПлюс это попросили помочь с мелким заданием, так что не вижу смысла человека
ещё и ключами компилятора заморачивать, ибо ему во всем остальном ещё
ковыряться и ковыряться.
Если так, почему Вы используете переменную Result? Она, знаете ли, тоже "заморачивать ключами компилятора".

LordMADЯ бы согласился, если бы отсутствие выключения ключа приводило бы к ошибке/предупреждению/хинту на этапе компиляции.
Кстати, неплохая мысль.... жаль, что Borland этого не сделает :)

Скажу так: с моей точки зрения, требование писать код так, чтобы он корректно работал при любых настройках Syntax Options - издевательство над программистом. Наверное, жестким регламентом такого добиться, но это на редкость непрактично.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34555990
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> Если так, почему Вы используете переменную Result? Она, знаете ли, тоже
> "заморачивать ключами компилятора".
Ну хотя бы потому, что она при настройках по умолчанию присутствует.
Потом, в исхоодниках VCL она используется направо и налево.
(Far'ом нашел 332 файла (в каталоге Delphi6\Source), где эта переменная используется).

ЗЫ. Народ, давайте не будем очередной холивар устраивать, а?
Ну какая разница кто как пишет - с ключами или без... Они для того
и были, по-моему, сделаны чтобы была извините, но возможность
1) ими пользоваться
2) ими не пользоваться
- смотря к чему у программера душа больше лежит....
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556079
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVНу хотя бы потому, что она при настройках по умолчанию присутствует.
И чем это отличается от приведенного мной кода? При настойках по умолчанию он будет правильно работать.

ErVПотом, в исхоодниках VCL она используется направо и налево.
В исходниках VCL полно мест, которые "могут привести к AV". Назвать точное количество затруднительно, скажем, только в TCustomForm:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 procedure  TCustomForm.CreateWindowHandle( const  Params: TCreateParams);
...
     if  (Application.MainForm =  nil )  or 
      (Application.MainForm.ClientHandle =  0 )  then 

 procedure  TCustomForm.SetActiveControl(Control: TWinControl);
...
     if   not  ((Control =  nil )  or  (Control <> Self)  and 
      (GetParentForm(Control) = Self)  and  ((csLoading  in  ComponentState)  or 

 procedure  TCustomForm.WMCommand( var  Message: TWMCommand);
...
     if  (Ctl <>  0 )  or  (Menu =  nil )  or   not  Menu.DispatchCommand(ItemID)  then 

 procedure  TCustomForm.CMAppSysCommand( var  Message: TMessage);
...
   if  (csDesigning  in  ComponentState)  or  (FormStyle = fsMDIChild)  or 
   (Menu =  nil )  or  Menu.AutoMerge  then 

 function  TCustomForm.QueryInterface( const  IID: TGUID;  out  Obj): HResult;
...
   if  (Designer =  nil )  or  (Designer.QueryInterface(IID, Obj) <>  0 )  then 

ErVЗЫ. Народ, давайте не будем очередной холивар устраивать, а? [/src]Да при чем тут холивар? В том, что касается заданного Вам вопроса, я пытаюсь найти хоть какую-то логику в действиях.

[quot ErV]Ну какая разница кто как пишет - с ключами или без... Они для того
и были, по-моему, сделаны чтобы была извините, но возможность
1) ими пользоваться
2) ими не пользоваться
- смотря к чему у программера душа больше лежит....
Да нет, к сожалению, совсем не для этого. Они были сделаны для того, чтобы избавиться от сегодняшнего прыщика ценой завтрашнего нарыва.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556144
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer LordMADЯ уже привел пример - это увеличение производительности.
Я помню и отвечаю с учетом этого.Ты не видишь практического смысла в увеличении производительности с помошью таких ключей?
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556150
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerСкажу так: с моей точки зрения, требование писать код так, чтобы он корректно работал при любых настройках Syntax Options - издевательство над программистом. Наверное, жестким регламентом такого добиться, но это на редкость непрактично.А советовать код, который работает только при определенных настройках, но не упомянуть об этих настройках, это не издевательство? ;)
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556171
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADТы не видишь практического смысла в увеличении производительности с помошью таких ключей?
Я не вижу смысла писать на дельфе фрагменты кода, из которого потребуется выжимать производительность таким образом. Лучше использовать ассемблерные вставки и/или более оптимизирующий компилятор.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556179
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADА советовать код, который работает только при определенных настройках, но не упомянуть об этих настройках, это не издевательство? ;)
Как я показал выше, автор изначально привел код, который работает только при определенных настройках. Если Вы оберегаете его от моей ошибки, оставляя в плену аналогичной собственной - это не издевательство?

Также отмечу, что мы вроде как давно пересекаемся в топиках, и до сего дня я не видел, чтобы в форуме Delphi или где-то еще Вы критиковали "код, который работает только при определенных настройках" - которого в архивах форума более чем достаточно.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556248
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ не вижу смысла писать на дельфе фрагменты кода, из которого потребуется выжимать производительность таким образом. Лучше использовать ассемблерные вставки и/или более оптимизирующий компилятор.Во-первых, ты слишком плохого мнения об этом компиляторе - помогая ему разными такими безделушками, можно получить довольно неплохих результатов (с учетом того, что код при этом остается хорошо читаем). Во-вторых, если говорить о delphi language, то более оптимизирующего компилятора не видать :(. В-третьих, нужно все-таки соизмерять трудозатраты по оптимизации - писать кусок на ассемблере - это зачастую в наше время через чур: несколько лишних mov, которые сделает копилятор - погоды уже не делают, а вот избавится от неоправданных условных переходов можно иногда и с помошью {B+}.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556277
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> И чем это отличается от приведенного мной кода? При настойках по умолчанию
> он будет правильно работать.
Допустим, мне просто не нравится такой вариант записи.
Просто по логике вещей аргумент такого типа: (not Assigned ( requirement ) or requirement)
для if должен раскладываться в дерево типа(or (not (assigned(requirement)), (requirement())),
Выражение обычно считается от меньшего к большему - будь оно арифметическое или нет, т.е.
чтобы посчитать or нужно вычислить оба его аргумента - т.е. assigned() и requrement().
Посему запись "if not assigned(requrement) or requrement" выглядит лично для меня двусмысленной,
так как работает не так как написана.
Т.е. вместо if not assigned(requrement) or requirement имеем несколько другое выражение,
которое имеет двоякую интерпретацию, что лично меня "не по душе"...

Такой ответ вас устроит?

ЗЫ. млин, и вообще это было разовое мелкое задание...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556435
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LordMADВо-первых, ты слишком плохого мнения об этом компиляторе
Скорее, слишком аккуратист. Предпочитаю завинчивать каждую гайку подходящим ключом.

LordMADВо-вторых, если говорить о delphi language, то более оптимизирующего компилятора не видать :(
Ну так и нефиг писать критические с вычислительной точки зрения куски на Delphi. Оно не для этого.

LordMADВ-третьих, нужно все-таки соизмерять трудозатраты по оптимизации - писать кусок на ассемблере - это зачастую в наше время через чур
Зачем "писать"? Взять сгенерированный и доработать напильником - для мелких улучшений самое то.
...
Рейтинг: 0 / 0
Delphi 6: сравнить указатель на функцию с nil.
    #34556444
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVПосему запись "if not assigned(requrement) or requrement" выглядит лично для меня двусмысленной, так как работает не так как написана.
Странное имхо рассуждение. Я так полагаю, оно в конечном итоге сводится к той двусмысленности, которую допустил Борланд, когда позволил писать Assigned(P) вместо Assigned(@P) итп.

ErVЗЫ. млин, и вообще это было разовое мелкое задание...
На которое я ответил одной строкой :)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi 6: сравнить указатель на функцию с nil.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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