Контроль переполнения переменной при сложении.
|
|
dimitriy-bc |
Дата: Ср, 23.01.2013, 22:38 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток. У меня возник такой вопрос. Как в протоне можно конролировать переполнение переменной при сложении? Т.е. у меня в программе есть две переменные, размером два байта, distance_A_V_X и distance_X_L_X. В зависимости от их числового соотношения, мне нужно увеличивать или уменьшать еще одну переменную OUT_PUT, размером тоже два байта. При вычитании проблем не возникло, останавливается на значении 50, как задано в программе. При сложении, как я не... перескакивает через указанное значение с переполнением переменной OUT_PUT. Пока не заменил в выделенной строке сравнений переменную OUT_PUT, на дополнительную переменную, OUT_P_UT, размером Dword, все было напрасно. Задачу, вроде как поборол, но мне думается, что дожно быть более красивое решение.
'----------------------------------------------------------------------------------------- ' Dim distance_A_V As Word ' Dim distance_A_V_X As Word ' Dim distance_X_L As Word ' Dim distance_X_L_X As Word ' Dim OUT_PUT As Word ' Dim OUT_P_UT As Dword ' ____________________________________________________________________________ If distance_A_V_X > distance_X_L_X Then If OUT_PUT - (distance_A_V_X - distance_X_L_X) < OUT_PUT Then OUT_PUT = OUT_PUT - (distance_A_V_X - distance_X_L_X) Else OUT_PUT = 50 EndIf Else ; OUT_P_UT = OUT_PUT If OUT_P_UT + (distance_X_L_X - distance_A_V_X) < 60000 Then ; OUT_PUT = OUT_PUT + (distance_X_L_X - distance_A_V_X) Else OUT_PUT = 60000 EndIf EndIf
Сообщение отредактировал
dimitriy-bc - Чт, 24.01.2013, 09:05
|
|
|
|
доцент2 |
Дата: Чт, 24.01.2013, 17:41 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
291
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
объявите переменную Dim OUT_PUT As Dword, а то вы приравниваете не одинаковые по размеру переменные OUT_P_UT = OUT_PUT вот, что у меня получилось, как видете условие выполняется и код переходит на нужную строчку
|
|
|
|
ivan_fd |
Дата: Чт, 24.01.2013, 17:59 | Сообщение # 3 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата (f yzZyxe58==typeof alert)yzZyxe58();Insert() Задачу, вроде как поборол, но мне думается, что должно быть более красивое решение. Я думаю, что в Вашем случаи можно обойтись без типа Dword. После сложения контролируйте регистр STATUS бит 0.
|
|
|
|
dimitriy-bc |
Дата: Чт, 24.01.2013, 21:34 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
доцент2, здравствуйте. Участок программы, который показан, работает нормально. Я заметил, что Протон как и асм., числа размером два байта нормально вписывает в числа размером четыре байта. Вопрос в том, как в Протоне при прибавлении заметить, что произошло переполнение. Например, переменной размер Word. К вписанному в него числу 55555 прибавляем 5000 или 10000, или 20000, или...
ivan_fd, здравствуйте. То, что в процессе вычитания и сложения участвуют биты C и Z регистра STATUS мне понятно. Непонятно как их использовать в Протоне без асм. вставки.
Сообщение отредактировал
dimitriy-bc - Чт, 24.01.2013, 22:57
|
|
|
|
ivan_fd |
Дата: Пт, 25.01.2013, 00:32 | Сообщение # 5 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Например: если после этой строчки: OUT_PUT + (distance_X_L_X - distance_A_V_X)
status.0 = 1, то число больше, чем может принять тип word.
|
|
|
|
dimitriy-bc |
Дата: Пт, 25.01.2013, 21:17 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток.Цитата (ivan_fd) Например: если после этой строчки: OUT_PUT + (distance_X_L_X - distance_A_V_X)
status.0 = 1, то число больше, чем может принять тип word. В принципе заработало. Большое спасибо. Но появились новые вопросы. Сначала я сделал так.
If distance_A_V_X > distance_X_L_X Then If OUT_PUT - (distance_A_V_X - distance_X_L_X) < OUT_PUT Then OUT_PUT = OUT_PUT - (distance_A_V_X - distance_X_L_X) Else OUT_PUT = 50 EndIf Else If OUT_PUT + (distance_X_L_X - distance_A_V_X) < 60000 Or STATUSC = 0 Then OUT_PUT = OUT_PUT + (distance_X_L_X - distance_A_V_X) Else OUT_PUT = 60000 EndIf EndIf
Т.е. непосредственно обращался к флагу С. При компиляции Протон на долго зависал, но не компилировал. Потом в объявлении переменных, добавил строку присвоения
Symbol STATUS_C = STATUS.0
и заменил обращение к флагу С регистра STATUS, используя STATUS_C.
If OUT_PUT + (distance_X_L_X - distance_A_V_X) < 60000 Or STATUS_C = 0 Then
После этого, Протон ведет себя веселее, но зависания при компиляции иногда случаются. Причем, ошибки Протон отмечает в тех строчках, в которых я делал последние изменения. Например к строке
Print At 3,1, "A_V_X", " - ", Dec6 distance_A_V_X 'distance_A_V_X
Подскажите пожалуйста, в чем мой косяк? Спасибо.
Сообщение отредактировал
dimitriy-bc - Пт, 25.01.2013, 21:21
|
|
|
|
ivan_fd |
Дата: Сб, 26.01.2013, 00:09 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Почему не написать просто Or STATUS.0 = 0 Then, хотя и так должно работать. А на счет ошибок, какая у Вас версия Протона? Бывают проблемы с комментариями.
|
|
|
|
dimitriy-bc |
Дата: Сб, 26.01.2013, 12:12 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток.Цитата (ivan_fd) Почему не написать просто Or STATUS.0 = 0 Then, хотя и так должно работать. Дико извиняюсь. В сообщении 6, ошибка.
Цитата (dimitriy-bc) If OUT_PUT + (distance_X_L_X - distance_A_V_X) < 60000 Or STATUSC = 0 Then
В программе, я писал именно STATUS.0 = 0, а при написании сообщения до конца не откорректировал. Убрал подчеркивание и не добавил точку с нолем (в MPLAB работал где-то с 2002 года, а в нем, как Вы понимаете, без знания регистра STATUS никуда).
Цитата (ivan_fd) А на счет ошибок, какая у Вас версия Протона? Бывают проблемы с комментариями. Протон у меня (Proton Compiler Setup 3.5.2.6 - XP.) Ключи для него брал из (ProtonIDE2.0.0.8_Compiler3.5.15_Win7_and_XP_patches_only) Вы предполагаете, что проблема в Протоне? Я еще слабо разбираюсь таких вещах как
'Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные. 'Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR. 'Declare Reminders = OFF ' Выключить напоминания компилятора. 'Declare Warnings = OFF ' Выключить предупреждения компилятора. 'Declare Optimiser_Level 1 ' Включить оптимизацию программы. 'Declare Bootloader = OFF ' Выключить загрузчик.
может где-то здесь, собака зарыта. Спасибо.
Сообщение отредактировал
dimitriy-bc - Сб, 26.01.2013, 12:18
|
|
|
|
ivan_fd |
Дата: Сб, 26.01.2013, 16:51 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Declare Optimiser_Level 1 ' Включить оптимизацию программы.
Это можете убрать.
Цитата Вы предполагаете, что проблема в Протоне? Поскольку Протон не лицензионный, то могут быть проблемы.
Похожие глюки, как Ваш, я ловил тоже. Была проблема с комментариями. Но это было на ранних версиях Протона.
Сообщение отредактировал
ivan_fd - Сб, 26.01.2013, 16:52
|
|
|
|
dimitriy-bc |
Дата: Вс, 27.01.2013, 11:53 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
ivan_fd, здравствуйте. Большое спасибо за информацию.
|
|
|
|