Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: short long непонятно работает
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Vavan4ik
Всем привет!

При написании программы столкнулся с такими приколами:
Почему-то переменные типа short long и long не могут сравниваться с литералами, например проверка на отрицательность, причем в тестовой проге все проверяет и работает. Неделю бьюсь ничего в голову не приходит, помогите кто знает...

short long Integ_M;
short long Prop_M;
short long Pid_Out_M;
...

if (Pid_Out_M < 0) {Z_CurrentMod = 0;}
else if (Pid_Out_M < 40) {Z_CurrentMod = 40;} // 15..40 => 40
else if (Pid_Out_M < ImaxMod) {Z_CurrentMod = Pid_Out_M;}
else {Z_CurrentMod = ImaxMod;} // >175 => 175

в итоге имеем такое сообщение:

Error [712] main.c; 509. can't generate code for this expression
_Pasha
Цитата(Vavan4ik @ Mar 5 2009, 12:50) *
Error [712] main.c; 509. can't generate code for this expression


На всякий случай: какой компилер?
zltigo
Цитата(Vavan4ik @ Mar 5 2009, 12:50) *
short long Integ_M;
short long Prop_M;
short long Pid_Out_M;

Изумительно sad.gif а что такеое "short long" ??? Вы уж для начала определитесь либо short, либо long.
xemul
Цитата(_Pasha @ Mar 5 2009, 13:11) *
На всякий случай: какой компилер?

Вас интересует, у какого компилера не сносит крышу от описания short long?smile.gif

2Vavan4ik посмотрите в мануале на используемый компилятор, какие типы данных он понимает (на это уйдет меньше недели). Доступные мне компиляторы не знают, что можно сделать с коротким, но длинным.
Vavan4ik
1) для начала
HI-TECH C PRO for the PIC10/12/16 MCU family candidate build 3206 V9.60PL4
Copyright © 1984-2008 HI-TECH SOFTWARE

2)
3.3.5 24-Bit Integer Data Types
HI-TECH C PRO for the PIC10/12/16 MCU Family supports four 24-bit integer types. short
long are 24-bit two’s complement signed integer types, representing integral values from -8,388,608
to +8,388,607 inclusive. Unsigned short and unsigned int are 16-bit unsigned integer
types, representing integral values from 0 to 16,777,215 inclusive. All 24-bit integer values are
represented in little endian format with the least significant byte at the lower address.
Variables may be declared using the signed short long int and unsigned short
long int keyword sequences, respectively, to hold values of these types. When specifying a
short long int type, the keyword int may be omitted. Thus a variable declared as short
long will contain a signed short long int and a variable declared as unsigned short
long will contain an unsigned short long int.

вродебы понятно, и даже работает в тестовой программе а реальной не хочет, зараза...
xemul
Цитата(Vavan4ik @ Mar 5 2009, 13:32) *
1) для начала
HI-TECH C PRO for the PIC10/12/16 MCU family candidate build 3206 V9.60PL4
Copyright © 1984-2008 HI-TECH SOFTWARE

Да, действительно. Приношу извинения. имхо, хтсофтчан одолела какая-то немочь перверсивная...
Цитата
вродебы понятно, и даже работает в тестовой программе а реальной не хочет, зараза...

Количество глюков в про PL4 по сравнению с PL3 убавилось, но не настолько, чтобы ему можно было верить (я про более земные вещи по сравнению с short long). А возможная экономия 10-20 слов на 1 Кслове (по сравнению с стд) не перевешивает дополнительного времени на ловлю компиляторных блох.
Вы не пробовали посмотреть, во что транслируются даже те операции с short long, которые компилятор понимает? Я только что попробовал. Бред... Может в следующих PL хтсофт полечит причуды short long, но нужно ли пользоваться нестандартными и непортируемыми типами - решать Вам.
Vavan4ik
Спасибо за ответ, но как быть, если нужно работать с большими целочисленными числами ( 2 ПИД регулятора), или все таки float?? что-то не хочется...
xemul
Цитата(Vavan4ik @ Mar 5 2009, 14:23) *
Спасибо за ответ, но как быть, если нужно работать с большими целочисленными числами ( 2 ПИД регулятора), или все таки float?? что-то не хочется...

а чем просто long не устраивает? имхо, столько памяти, чтобы за это стоило биться, все равно не съэкономите.
ну или сделайте свой short long и напишите всю используемую математику для этого типа (хе-хе, типа совет по Остеруsmile.gif)
Vavan4ik
дело в том, что и long выделывается, как ни крути его...

да и памяти данных уже использовано 55% а еще есть что писать sad.gif
xemul
Цитата(Vavan4ik @ Mar 5 2009, 14:31) *
дело в том, что и long выделывается, как ни крути его...

В чем именно? Я сейчас проверил +-*/ с long в про - все вполне корректно.
Все сорцы по арифметике в .../pro/.../sources. Если не лень, разбирайтесь.
Цитата
да и памяти данных уже использовано 55% а еще есть что писать

Дык (сложную) математику на мелких пиках крутить... неразумно. Но это уже проблема выбора контроллера под задачу, а не проблема компилятора.
_Pasha
Цитата(Vavan4ik @ Mar 5 2009, 13:32) *
HI-TECH C PRO for the PIC10/12/16 MCU family candidate build 3206 V9.60PL4

crying.gif Я так и думаль...

Цитата(xemul @ Mar 5 2009, 14:10) *
полечит причуды short long, но нужно ли пользоваться нестандартными и непортируемыми типами - решать Вам.

Они (24-бит) на пиках неплохо смотрятся. Ну ... не на всех, конечно. В данном случае - это извращеньице. По теме - перейдите от if-else к тернарным многоэтажным выражениям - должно попустить. 
Vavan4ik
я уже писал, что в тесте все работает красиво, а в реальной проге не хочет. Вот я сейчас удалил про и поставил стд, тот же проект еще кучу всего написал и про sprintf и про _delay_ms() устал уже от этого...

такое чудит без баяна

Error [491] ; . can't find 0x68 words for psect "rbss_0" in segment "BANK0"
Error [593] ; . can't find 0x2 words (0x2 withtotal) for psect "code_ptr" in segment "BANK0"
Error [593] ; . can't find 0x2 words (0x2 withtotal) for psect "intsave" in segment "BANK0"
Error [593] ; . can't find 0x1 words (0x1 withtotal) for psect "intsave" in segment "BANK0"
xemul
Цитата(Vavan4ik @ Mar 5 2009, 15:13) *
я уже писал, что в тесте все работает красиво, а в реальной проге не хочет. Вот я сейчас удалил про и поставил стд,

Зачем удалять? Они (и с разными PL в пределах про или стд) прекрасно сосуществуют. Поднимаете в Build Options->Driver нужную версию наверх, и вперед.
Цитата
тот же проект еще кучу всего написал и про sprintf и про _delay_ms() устал уже от этого...

_delay_ms() в стд нет. В std/.../samples/delay/delay.* присутствуют DelayUs() и DelayMs() (хотя я считаю эти функции идеологически вредными).
xxxprintf, учитывая все, что они за собой тянут, в мелких пиках лучше избегать. Если нужен вывод чисел на показометр, используйте какие-нить более гуманные самописные xxxtoa() - обсуждалось в конфе не раз, в основном, применительно к AVR.
Цитата
такое чудит без баяна

Error [491] ; . can't find 0x68 words for psect "rbss_0" in segment "BANK0"
Error [593] ; . can't find 0x2 words (0x2 withtotal) for psect "code_ptr" in segment "BANK0"
Error [593] ; . can't find 0x2 words (0x2 withtotal) for psect "intsave" in segment "BANK0"
Error [593] ; . can't find 0x1 words (0x1 withtotal) for psect "intsave" in segment "BANK0"

Дык sprintf однако ж...
Vavan4ik
большое человеческое спаПИВО!
Vavan4ik
Вот я еще хотел спросить знатоков, нужно ли подключать какую-либо стандартную библиотеку, чтобы работать с long ? и какие могут быть грабли?
переменные long описываются в начале файла и используются как глобальные, затем в функции они используются (я так понимаю, что содержимое глобальных переменных доступно везде) :

Pid_Out_M = ((Prop_M + Integ_M + Deriv_M));
Pid_Out_M = Pid_Out_M /342; // 0...175

if (Pid_Out_M < 0) {Z_CurrentMod = 0;}
else {Z_CurrentMod = Pid_Out_M;}
else if (Pid_Out_M < 40) {Z_CurrentMod = 40;} // 15..40 => 40
else if (Pid_Out_M < ImaxMod) {Z_CurrentMod = Pid_Out_M;}
else {Z_CurrentMod = ImaxMod;} // >175 => 175

После выполнения второй строки при отрицательном Pid_Out_M результат положительный и неверный sad.gif((

Ничччего не понимаюююю
_Pasha
Цитата(Vavan4ik @ Mar 6 2009, 11:11) *
Ничччего не понимаюююю

Вы хоть сами понимаете, что написали в if-else ? sad.gif 

Код
Z_CurrentMod = (Pid_Out_M < 0)? 0 : ((Pid_Out_M < 40)? 40 : ((Pid_Out_M < ImaxMod)? Pid_Out_M:ImaxMod));


Проверьте скобки
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.