Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Выполнится ли Beep ?   Найти похожие ветки 

 
Ega23 ©   (2005-01-19 12:12) [0]

Сразу оговорюсь: то, что ТАК делать нельзя - я прекрасно понимаю. Сейчас как раз занимаюсь "перекраиванием" логики. Но вопрос, тем не менее, остался.

Имеется следующая ситуация:


if (SomeObject.SomeProperty) and (SomeFunction(SomeObject)) then Beep;

function SomeFunction(SomeObject:TSomeObject):Boolean;
begin
...
SomeObject.Free;
Result:=True;
end;


SomeObject.SomeProperty в условии - True.
Изменится ли выполнение условия, после выполнения SomeFunction?


 
Amoeba ©   (2005-01-19 12:14) [1]

А разве нельзя проверить опытным путем?


 
Poirot ©   (2005-01-19 12:19) [2]

По моему скромному мнению только эксперементально и буит сильно зависеть от компилятора. Но по идее с лева на право буит вычисляться и если в SomeFunction что-то изменится, то оно не должно влиять... ибо уже часть выражения вычислено...


 
default ©   (2005-01-19 12:20) [3]

с вер-ью 0.99 нет
хотя бы только потому что переменная SomeObject в nil не устанавливается даже в случае проверки справа налево


 
Александр Иванов ©   (2005-01-19 12:22) [4]

Все будет работать. Но если выбран короткий вариант расчета логических выражений {$B-} и SomeObject.SomeProperty = False, то ф-я SomeFunction не выполнится


 
Digitman ©   (2005-01-19 12:29) [5]


> Изменится ли выполнение условия, после выполнения SomeFunction?


повторная проверка условия приведет к исключению, потому что SomeObject был тобой же и (надеюсь - успешно) разрушен в теле SomeFunction .. если конечно же перед повторной проверкой условия ты не создаешь SomeObject объект вновь .. но тогда и говорить об обязательной истинности условия SomeObject.SomeProperty не приходится - в ходе или после воссоздания объекта SomeObject ответственность за иниц-цию св-ва SomeProperty полностью лежит на тебе


 
default ©   (2005-01-19 12:33) [6]

Digitman ©   (19.01.05 12:29) [5]
врял-ли будет исключение
дело в том что память объекта как минимум не затирается
весь код и данные остаются в прежнем состоянии
именно поэтому я упомянул про nil


 
default ©   (2005-01-19 12:36) [7]

+ [6]
конечно, всё зависит от времени между проверками условий
вообщем от случая(если проверки идут не через маленькие куски времени)
строго же говорить что будет исключение неверно


 
Ega23 ©   (2005-01-19 12:36) [8]

2 Digitman ©   (19.01.05 12:29) [5]

Т.е., насколько я тебя понял, логическое вычисление будет производиться дважды?

Как я себе представляю данный процесс:
1. Вычисляем первый операнд. Получаем истину.
2. Записываем значение первого операнда в ячейку памяти.
3. Вычисляем второй операнд. Получаем истину. При этом "грохаем" первый операнд.
4. Записываем значение второго операнда в ячейку памяти.
5. Сравниваем 2 ячейки памяти, получаем истину, выполняем Beep.

Будут ли предприняты какие-то действия между 4-м и 5-м пунктами? Зависит ли это от компиллятора?


 
Ega23 ©   (2005-01-19 12:37) [9]

Да, забыл сказать: операция сравнения выполняется ОДНОКРАТНО. Второго вхождения в неё уже нет.


 
default ©   (2005-01-19 12:37) [10]

Ega23 ©   (19.01.05 12:36) [8]
посмотри окно CPU и всё
для этого нужно максимум минуты две, а прошло уже как минимум 24


 
Ega23 ©   (2005-01-19 12:48) [11]

для этого нужно максимум минуты две, а прошло уже как минимум 24

Блин, у нас электричество каждые 5 минут отрубают - электрики что-то химичат. Я кроме Mozillы ничего и не запускаю...


 
Digitman ©   (2005-01-19 12:59) [12]


> default ©   (19.01.05 12:33) [6]
> врял-ли будет исключение
> дело в том что память объекта как минимум не затирается


полагаться на это не следует


> Ega23 ©   (19.01.05 12:36) [8]
> Т.е., насколько я тебя понял, логическое вычисление будет
> производиться дважды?


о каком вычислении ты говоришь ? вычиcлении всего выражении, стоящего в if ?
сколько раз на if-оператор будет передано управление, столько раз и вычисляться будет if-условие

но для того чтобы вычислить условие, заданное тобой в if-операторе, компилятору нужно первым делом получить зн-е св-ва SomeObject.SomeProperty.. а как получить св-во уже несуществующего объекта ? ты же убил его собственными руками при первом же вызове SomeFunction !


 
Ega23 ©   (2005-01-19 13:01) [13]

а как получить св-во уже несуществующего объекта ? ты же убил его собственными руками при первом же вызове SomeFunction !

Да, но вычисление SomeObject.SomeProperty стоит ДО вычисления SomeFunction


 
Ega23 ©   (2005-01-19 13:01) [14]

а как получить св-во уже несуществующего объекта ? ты же убил его собственными руками при первом же вызове SomeFunction !

Да, но вычисление SomeObject.SomeProperty стоит ДО вычисления SomeFunction


 
default ©   (2005-01-19 13:04) [15]

Digitman ©   (19.01.05 12:59) [12]
"полагаться на это не следует"
само собой
Ega32 имел ввиду [9]
Ega23 ©   (19.01.05 12:48) [11]
"Изменится ли выполнение условия, после выполнения SomeFunction?"
нет


 
Ega23 ©   (2005-01-19 13:07) [16]

Понял, спасибо.


 
Digitman ©   (2005-01-19 13:10) [17]


> Да, но вычисление SomeObject.SomeProperty стоит ДО вычисления
> SomeFunction


да, но ты же говоришь что перед этим как минимум однократно ф-ция SomeFunction уже выполнилась !

вообще говоря, мне непонятна конечная логика всего этого кода ..

к тому же полагаться на строго определенный (слева направо, как написано) порядок вычисления выражений в if-условии не следует - компилятор волен принимать эксклюзивное решение, в каком порядке производить вычисление выражений в этом условии .. так что исключение вполне может произойти и на строчке SomeObject.Free, если компилятор примет решение первым делом вычислить выражение SomeFunction(SomeObject), а не SomeObject.SomeProperty


 
Ega23 ©   (2005-01-19 13:19) [18]

вообще говоря, мне непонятна конечная логика всего этого кода ..

Переделываю старую программу, получилась такая ситуация. Что так нельзя делать - понимаю.

к тому же полагаться на строго определенный (слева направо, как написано) порядок вычисления выражений в if-условии не следует - компилятор волен принимать эксклюзивное решение, в каком порядке производить вычисление выражений в этом условии ..

Вот. Собственно, именно это и хотел услышать. Т.е. необязательно сначала первое, потом второе и т.д. условия...


 
Digitman ©   (2005-01-19 13:29) [19]


> Ega23 ©   (19.01.05 13:19) [18]


ну вообще-то говоря насчет AND можно еще и порассуждать на тему порядка, а вот OR однозначно не подразумевает совпадение порядка.

глубинный смысл всего этого я так и не понял, поэтому интерпретирую требуемую тебе логику вот в таком варианте исправленного кода

if Assigned(SomeObject) and SomeObject.SomeProperty then
begin
SomeFunction(SomeObject);
Beep;
end;

procedure SomeFunction(SomeObject:TSomeObject);
begin
...
FreeAndNil(SomeObject);
end;

в рез-те никаких бипов не будет, если SomeObject на момент выполнения проверки еще/уже не существует


 
Digitman ©   (2005-01-19 13:32) [20]

пардон,
procedure SomeFunction(var SomeObject:TSomeObject);


 
Ega23 ©   (2005-01-19 13:33) [21]

глубинный смысл всего этого я так и не понял, поэтому интерпретирую требуемую тебе логику вот в таком варианте исправленного кода

Нет, ничего интерпретировать не надо, я всё совсем по-другому перекраивать буду.
Просто сам вопрос интересен был.


 
Юрий Зотов ©   (2005-01-19 13:45) [22]

Если компилятор писали не дураки (а в этом вряд ли стоит сомневаться), то в данном случае он должен вычислить выражение строго так, как оно написано, не пытаясь оптимизировать порядок вычислений.

Дело в том, что чтение свойства SomeProperty может приводить к вызову метода Get, в котором могут выполняться любые действия. А в результате этих действий состояние программы на момент вызова функции SomeFunction может измениться и повлиять на ее результат. Таким образом, результаты вычисления всего выражения по схемам "слева направо" и "справа налево" могут оказаться разными - и ни один компилятор не в состоянии определить, может ли такое произойти, или нет.

Это может определить только человек. А компилятор обязан полагать, что программист написал выражение именно так, как ему это нужно, и не вмешиваться.

Аналогичный пример:

var
 A, i: integer;

procedure SetA;
begin
 A := 0
end;

for i := 1 to 5 do A := 0;
for i := 1 to 5 do SetA;

Оба цикла делают, по сути, одно и то же. Но в первом случае оптимизатор может вынести инвариант за цикл, а затем и исключить сам цикл. Во втором же случае он не имеет права этого делать, потому что он все же не ИИ, и ему неизвестно, что делает процедура SetA.


 
Ega23 ©   (2005-01-19 13:48) [23]

2 Юрий Зотов ©   (19.01.05 13:45) [22]

Вполне исчерпывающе. Спасибо.


 
Юрий Зотов ©   (2005-01-19 13:52) [24]

> Ega23 ©   (19.01.05 13:48) [23]

Но полагаться на это все равно не стоит. Компилятор, ясное дело, писали далеко не дураки, но ошибаются ведь и умные тоже.


 
Ega23 ©   (2005-01-19 13:56) [25]

2 Юрий Зотов ©   (19.01.05 13:52) [24]

Ну то, что я всё переделаю, это даже не обсуждается... :о)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.038 c
8-1098038113
ZedeS
2004-10-17 22:35
2005.01.30
Заметки на рабочем столе


3-1104211490
slart
2004-12-28 08:24
2005.01.30
Delphi+Mysql


8-1098353994
Ozone
2004-10-21 14:19
2005.01.30
Bitmaps to AVI


14-1105121935
Fin
2005-01-07 21:18
2005.01.30
WI FI


4-1102306451
TankMan
2004-12-06 07:14
2005.01.30
А как заставить работать WMI на 9х?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский