|
short long непонятно работает |
|
|
|
Mar 5 2009, 09:50
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
Всем привет!
При написании программы столкнулся с такими приколами: Почему-то переменные типа 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
Сообщение отредактировал Vavan4ik - Mar 5 2009, 09:53
|
|
|
|
|
Mar 5 2009, 10:32
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
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.
вродебы понятно, и даже работает в тестовой программе а реальной не хочет, зараза...
|
|
|
|
|
Mar 5 2009, 11:10
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(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, но нужно ли пользоваться нестандартными и непортируемыми типами - решать Вам.
|
|
|
|
|
Mar 5 2009, 11:23
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
Спасибо за ответ, но как быть, если нужно работать с большими целочисленными числами ( 2 ПИД регулятора), или все таки float?? что-то не хочется...
|
|
|
|
|
Mar 5 2009, 11:33
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
дело в том, что и long выделывается, как ни крути его... да и памяти данных уже использовано 55% а еще есть что писать
|
|
|
|
|
Mar 5 2009, 11:58
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Vavan4ik @ Mar 5 2009, 14:31)  дело в том, что и long выделывается, как ни крути его... В чем именно? Я сейчас проверил +-*/ с long в про - все вполне корректно. Все сорцы по арифметике в .../pro/.../sources. Если не лень, разбирайтесь. Цитата да и памяти данных уже использовано 55% а еще есть что писать Дык (сложную) математику на мелких пиках крутить... неразумно. Но это уже проблема выбора контроллера под задачу, а не проблема компилятора.
|
|
|
|
|
Mar 5 2009, 12:13
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
я уже писал, что в тесте все работает красиво, а в реальной проге не хочет. Вот я сейчас удалил про и поставил стд, тот же проект еще кучу всего написал и про 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"
|
|
|
|
|
Mar 5 2009, 12:40
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(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 однако ж...
|
|
|
|
|
Mar 5 2009, 12:54
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
большое человеческое спаПИВО!
|
|
|
|
|
Mar 6 2009, 07:11
|
Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690

|
Вот я еще хотел спросить знатоков, нужно ли подключать какую-либо стандартную библиотеку, чтобы работать с 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 результат положительный и неверный  (( Ничччего не понимаюююю
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|