Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Как проще проверять логические условия?
vladh Дата: Вт, 25.08.2015, 16:05  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 25.08.2015
ADMIN Дата: Вт, 25.08.2015, 17:11  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А можно проект посмотреть?
vladh Дата: Ср, 26.08.2015, 09:08  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

А у меня все нормально работает.
vladh Дата: Ср, 26.08.2015, 09:57  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата dimvad ()
А у меня все нормально работает.
Я это проверял на двух компьютерах. На работе(сейчас) и дома. Вы в строке 245 Brekpoint устанавливаете? В течении какого времени вы следите за процессом? И какая версия компилятора Протон у Вас? У меня за минуту сработало 7 раз.

Сообщение отредактировал vladh - Ср, 26.08.2015, 10:00
dimvad Дата: Ср, 26.08.2015, 10:08  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Ставлю точку останова в строке 244 и смотрю пошагово , условие пролетает строку 245. Если пинудительно присваиваю переменной Reg значение 32, то перехожу на строку 245. Это с Вашей
версией Протона. Если перекомпилировать в версии 3556, то тоже работает.
vladh Дата: Ср, 26.08.2015, 10:15  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата dimvad ()
Ставлю точку останова в строке 244 и смотрю пошагово , условие пролетает строку 245
Это ничего не даст. Я просил ставить точку останова на строке 245, запустить программу в динамике и ждать попадания в эту точку.
Правда, я сейчас попробовал отключить прерывания от таймера и сразу беда прекратилась.
dimvad Дата: Ср, 26.08.2015, 10:30  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 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
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата dimvad ()
А у вас какой протон?
3.5.2.7
dimvad Дата: Ср, 26.08.2015, 10:38  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

У меня как раз наоборот было, что логические операции в 3.5.2.7 работали нормально, а в 3.5.5.6 глючили
ivan_fd Дата: Ср, 26.08.2015, 11:09  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
Правда, я сейчас попробовал отключить прерывания от таймера и сразу беда прекратилась.


Вы в прерывании так же проверяете условие:
Код
if Reg = 31 Or Reg = 32 Or Reg = 42 Then T_i_p = T_i_p + 1

Похоже, что протон где то в прерывании портит регистр STATUS? вот и попадаем в строчку 245.
ЯНДЕКС Дата: 26.08.2015
vladh Дата: Ср, 26.08.2015, 11:36  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Вы в прерывании так же проверяете условие:
А я этого не увидел. Совместил в прерывании оба случая(как это и должно быть) и беда прекратилась. Огромное спасибо всем. А то уже из за жары все мозги вытекают.

Добавлено (26.08.2015, 11:34)
---------------------------------------------
Ан нет. не все просто оказалось. Как сказано было выше объединил эти два условия и разместил в области обработки прерываний все стало работать так как надо. Но если я размещаю его в области подпрограммы Rabota - беда остается! cry

Добавлено (26.08.2015, 11:36)
---------------------------------------------

Цитата dimvad ()
У меня как раз наоборот было, что логические операции в 3.5.2.7 работали нормально, а в 3.5.5.6 глючили
Уважаемый, dimvad, а у вас оба компилятора стоят одновременно на одном компьютере и под управлением одной и той же операционки?
dimvad Дата: Ср, 26.08.2015, 12:51  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 80
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Сейчас у меня стоит один компилятор 3.5.5.6 под XP.

Добавлено (26.08.2015, 12:51)
---------------------------------------------
И раньше когда эти глюки случались я каждый раз для чистоты эксперимента один компилятор сносил и ставил только один

ivan_fd Дата: Ср, 26.08.2015, 12:56  |                                                                                                                Сообщение # 14
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Еще и прерывания начинали с ума сходить. долго я мучился и в конце концов оставил этот прект в 3.5.2.7
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: