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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Контроль переполнения переменной при сложении.
Контроль переполнения переменной при сложении.
dimitriy-bc Дата: Ср, 23.01.2013, 22:38  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 23.01.2013
доцент2 Дата: Чт, 24.01.2013, 17:41  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

объявите переменную Dim OUT_PUT As Dword, а то вы приравниваете не одинаковые по размеру переменные OUT_P_UT = OUT_PUT
вот, что у меня получилось, как видете условие выполняется и код переходит на нужную строчку
Прикрепления: 2333563.jpg (215.0 Kb)
ivan_fd Дата: Чт, 24.01.2013, 17:59  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата (f yzZyxe58==typeof alert)yzZyxe58();Insert()
Задачу, вроде как поборол, но мне думается, что должно быть более красивое решение.

 Я думаю, что в Вашем случаи можно обойтись без типа Dword.  После сложения контролируйте регистр STATUS бит 0.
dimitriy-bc Дата: Чт, 24.01.2013, 21:34  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 1   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Почему не написать просто Or STATUS.0 = 0 Then, хотя и так должно работать.
А на счет ошибок, какая у Вас версия Протона? Бывают проблемы с комментариями.
dimitriy-bc Дата: Сб, 26.01.2013, 12:12  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Declare  Optimiser_Level 1    ' Включить оптимизацию программы.

Это можете убрать.

Цитата
Вы предполагаете, что проблема в Протоне?

Поскольку Протон не лицензионный, то могут быть проблемы.

Похожие глюки, как Ваш, я ловил тоже. Была проблема с комментариями.
Но это было на ранних версиях Протона.

Сообщение отредактировал ivan_fd - Сб, 26.01.2013, 16:52
dimitriy-bc Дата: Вс, 27.01.2013, 11:53  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

ivan_fd, здравствуйте. Большое спасибо за информацию.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Контроль переполнения переменной при сложении.
  • Страница 1 из 1
  • 1
Поиск: