Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi 6: сравнить указатель на функцию с nil. / 21 сообщений из 21, страница 1 из 1
25.05.2007, 18:28
    #34552505
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
Программа под 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
25.05.2007, 18:38
    #34552557
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
разобрался. Надо было
Код: plaintext
1.
2.
3.
4.
5.
6.
function TSimulationTimer.passRequirement: boolean;
begin
	result := true;
	if Assigned(requirement) then
		result := requirement;
end;
...
Рейтинг: 0 / 0
28.05.2007, 10:22
    #34554519
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
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
28.05.2007, 15:20
    #34555479
LordMAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
softwarerresult := not Assigned ( requirement ) or requirement ;[/src]
Жестоко людям советовать код, работоспособность которого зависит от настроек компилятора.
...
Рейтинг: 0 / 0
28.05.2007, 16:03
    #34555660
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
LordMADЖестоко людям советовать код, работоспособность которого зависит от настроек компилятора.
Фраза формально верна, но с ее сутью я в данном случае не соглашусь. Сами по себе подобные настройки - огромное зло и головотяпство. Это относится и к ряду дельфовых переключателей, и ко многим другим продуктам. Наличие такой настройки фактически означает отсутствие у идеологов продукта.... затруднюсь подобрать подходящее слово, есть такая идиома - "политическая воля", так вот, отсутствие "неполитической политической воли".

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

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

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

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

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

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

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

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

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

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

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

ЗЫ. Народ, давайте не будем очередной холивар устраивать, а?
Ну какая разница кто как пишет - с ключами или без... Они для того
и были, по-моему, сделаны чтобы была извините, но возможность
1) ими пользоваться
2) ими не пользоваться
- смотря к чему у программера душа больше лежит....
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.05.2007, 18:05
    #34556079
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
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
28.05.2007, 18:30
    #34556144
LordMAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
softwarer LordMADЯ уже привел пример - это увеличение производительности.
Я помню и отвечаю с учетом этого.Ты не видишь практического смысла в увеличении производительности с помошью таких ключей?
...
Рейтинг: 0 / 0
28.05.2007, 18:34
    #34556150
LordMAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
softwarerСкажу так: с моей точки зрения, требование писать код так, чтобы он корректно работал при любых настройках Syntax Options - издевательство над программистом. Наверное, жестким регламентом такого добиться, но это на редкость непрактично.А советовать код, который работает только при определенных настройках, но не упомянуть об этих настройках, это не издевательство? ;)
...
Рейтинг: 0 / 0
28.05.2007, 18:44
    #34556171
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
LordMADТы не видишь практического смысла в увеличении производительности с помошью таких ключей?
Я не вижу смысла писать на дельфе фрагменты кода, из которого потребуется выжимать производительность таким образом. Лучше использовать ассемблерные вставки и/или более оптимизирующий компилятор.
...
Рейтинг: 0 / 0
28.05.2007, 18:51
    #34556179
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 6: сравнить указатель на функцию с nil.
LordMADА советовать код, который работает только при определенных настройках, но не упомянуть об этих настройках, это не издевательство? ;)
Как я показал выше, автор изначально привел код, который работает только при определенных настройках. Если Вы оберегаете его от моей ошибки, оставляя в плену аналогичной собственной - это не издевательство?

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

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

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

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


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