Как проще проверять логические условия?
|
|
vladh |
Дата: Вт, 25.08.2015, 16:05 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Сегодня обнаружил одну неприятную штуку. Раньше я достаточно часто использовал условия типа If var1=1 Or var2=2 Or var3=2 Or....Then т.е. многократное использование оператора Or(или). По простому смысл отог можно описать так: Если переменная var1 равна этому, или переменная var2 равна вот этому или переменная var3 равна чему то еще То тогда.....Сегодня обнаружил, что при симуляции работы программы в Протеус происходит срабатывание этого условия, хотя ни одна из приведенных переменных не имела указанных значений. Причем чем больше членов сгруппированных по или тем выше вероятность ложного срабатывания. Посмотрел в руководстве. Там вроде как написано, что сравнивать надо только две переменных. Но как сделать проще если необходимо использовать условие при котором бы оценивалось количество членов больше двух? У кого есть решения этой проблемы?
Сообщение отредактировал
vladh - Вт, 25.08.2015, 16:23
|
|
|
|
ADMIN |
Дата: Вт, 25.08.2015, 17:11 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А можно проект посмотреть?
|
|
|
|
vladh |
Дата: Ср, 26.08.2015, 09:08 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ADMIN ( ) А можно проект посмотреть? Да, пожалуйста. Я только код значительно подсократил, чтобы уменьшить запутанность. После запуска программы нажмите на виртуальной клавиатуре клавишу "1". Откроется другое окно. В новом окне "нажмите клавишу "5". Откроется следующее окно. Здесь программа работает в подпрограмме обозначенной меткой Rabota:. В строках 244-246 производится проверка описанного ранее условия. В связи с тем, что здесь переменная Reg = 1 и только(в этом варианте), программа никогда не должна попасть на строку 245! Но если мы её запустим и установим Breakpoint в строке 245, то увидим, что программа периодически останавливается в этой точке. Причем систему остановки я пока не выявил. С другой стороны в строке 176 у меня три переменные, которые соединены двумя Or. Но здесь еще ни разу не происходило преждевременного выхода из цикла Repeat...Until
Прикрепления:
P1.rar
(84.0 Kb)
Сообщение отредактировал
vladh - Ср, 26.08.2015, 09:34
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 09:46 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
А у меня все нормально работает.
|
|
|
|
vladh |
Дата: Ср, 26.08.2015, 09:57 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата dimvad ( ) А у меня все нормально работает. Я это проверял на двух компьютерах. На работе(сейчас) и дома. Вы в строке 245 Brekpoint устанавливаете? В течении какого времени вы следите за процессом? И какая версия компилятора Протон у Вас? У меня за минуту сработало 7 раз.
Сообщение отредактировал
vladh - Ср, 26.08.2015, 10:00
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 10:08 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Ставлю точку останова в строке 244 и смотрю пошагово , условие пролетает строку 245. Если пинудительно присваиваю переменной Reg значение 32, то перехожу на строку 245. Это с Вашей версией Протона. Если перекомпилировать в версии 3556, то тоже работает.
|
|
|
|
vladh |
Дата: Ср, 26.08.2015, 10:15 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата dimvad ( ) Ставлю точку останова в строке 244 и смотрю пошагово , условие пролетает строку 245 Это ничего не даст. Я просил ставить точку останова на строке 245, запустить программу в динамике и ждать попадания в эту точку. Правда, я сейчас попробовал отключить прерывания от таймера и сразу беда прекратилась.
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 10:30 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Да, действительно, у Вас есть ложные срабатывания. Если в версии 3.5.5.6 то работает нормально. Добавлено (26.08.2015, 10:28) --------------------------------------------- 3 мин - полет нормальный Добавлено (26.08.2015, 10:30) --------------------------------------------- А у вас какой протон?
|
|
|
|
vladh |
Дата: Ср, 26.08.2015, 10:32 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата dimvad ( ) А у вас какой протон? 3.5.2.7
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 10:38 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
У меня как раз наоборот было, что логические операции в 3.5.2.7 работали нормально, а в 3.5.5.6 глючили
|
|
|
|
ivan_fd |
Дата: Ср, 26.08.2015, 11:09 | Сообщение # 11 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) Правда, я сейчас попробовал отключить прерывания от таймера и сразу беда прекратилась.
Вы в прерывании так же проверяете условие: Код if Reg = 31 Or Reg = 32 Or Reg = 42 Then T_i_p = T_i_p + 1 Похоже, что протон где то в прерывании портит регистр STATUS? вот и попадаем в строчку 245.
|
|
|
|
vladh |
Дата: Ср, 26.08.2015, 11:36 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Вы в прерывании так же проверяете условие: А я этого не увидел. Совместил в прерывании оба случая(как это и должно быть) и беда прекратилась. Огромное спасибо всем. А то уже из за жары все мозги вытекают.Добавлено (26.08.2015, 11:34) --------------------------------------------- Ан нет. не все просто оказалось. Как сказано было выше объединил эти два условия и разместил в области обработки прерываний все стало работать так как надо. Но если я размещаю его в области подпрограммы Rabota - беда остается! Добавлено (26.08.2015, 11:36) ---------------------------------------------
Цитата dimvad ( ) У меня как раз наоборот было, что логические операции в 3.5.2.7 работали нормально, а в 3.5.5.6 глючили Уважаемый, dimvad, а у вас оба компилятора стоят одновременно на одном компьютере и под управлением одной и той же операционки?
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 12:51 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Сейчас у меня стоит один компилятор 3.5.5.6 под XP. Добавлено (26.08.2015, 12:51) --------------------------------------------- И раньше когда эти глюки случались я каждый раз для чистоты эксперимента один компилятор сносил и ставил только один
|
|
|
|
ivan_fd |
Дата: Ср, 26.08.2015, 12:56 | Сообщение # 14 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) беда остается! А куда ей деться? Вот, смотрите: начинается обработка условия Код If Reg = 31 Or Reg = 32 Or Reg = 41 Or Reg = 42 Then и если, при этом, не было прерывания, то все нормально. А если произошло, то в прерывании, при обработке условия, изменяется регистр STATUS, биты C, DC, Z и при возвращении в основную процедуру, они то уже не те, что нам надо.
Наверное тут выход, запретить прерывания перед строчкой Код If Reg = 31 Or Reg = 32 Or Reg = 41 Or Reg = 42 Then и разрешить после.
|
|
|
|
dimvad |
Дата: Ср, 26.08.2015, 12:58 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
80
Замечания:
±
На сайте с 20.07.2012
Статус:
Offline
|
Еще и прерывания начинали с ума сходить. долго я мучился и в конце концов оставил этот прект в 3.5.2.7
|
|
|
|