реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> short long непонятно работает
Vavan4ik
сообщение Mar 5 2009, 09:50
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 10:11
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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


На всякий случай: какой компилер?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 5 2009, 10:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(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.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 5 2009, 10:25
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(_Pasha @ Mar 5 2009, 13:11) *
На всякий случай: какой компилер?

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

2Vavan4ik посмотрите в мануале на используемый компилятор, какие типы данных он понимает (на это уйдет меньше недели). Доступные мне компиляторы не знают, что можно сделать с коротким, но длинным.
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 5 2009, 10:32
Сообщение #5





Группа: Участник
Сообщений: 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.

вродебы понятно, и даже работает в тестовой программе а реальной не хочет, зараза...
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 5 2009, 11:10
Сообщение #6



*****

Группа: Свой
Сообщений: 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, но нужно ли пользоваться нестандартными и непортируемыми типами - решать Вам.
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 5 2009, 11:23
Сообщение #7





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



Спасибо за ответ, но как быть, если нужно работать с большими целочисленными числами ( 2 ПИД регулятора), или все таки float?? что-то не хочется...
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 5 2009, 11:28
Сообщение #8



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Vavan4ik @ Mar 5 2009, 14:23) *
Спасибо за ответ, но как быть, если нужно работать с большими целочисленными числами ( 2 ПИД регулятора), или все таки float?? что-то не хочется...

а чем просто long не устраивает? имхо, столько памяти, чтобы за это стоило биться, все равно не съэкономите.
ну или сделайте свой short long и напишите всю используемую математику для этого типа (хе-хе, типа совет по Остеруsmile.gif)
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 5 2009, 11:33
Сообщение #9





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



дело в том, что и long выделывается, как ни крути его...

да и памяти данных уже использовано 55% а еще есть что писать sad.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 5 2009, 11:58
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Vavan4ik @ Mar 5 2009, 14:31) *
дело в том, что и long выделывается, как ни крути его...

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

Дык (сложную) математику на мелких пиках крутить... неразумно. Но это уже проблема выбора контроллера под задачу, а не проблема компилятора.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 12:03
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(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 к тернарным многоэтажным выражениям - должно попустить. 
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 5 2009, 12:13
Сообщение #12





Группа: Участник
Сообщений: 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"
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 5 2009, 12:40
Сообщение #13



*****

Группа: Свой
Сообщений: 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 однако ж...
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 5 2009, 12:54
Сообщение #14





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



большое человеческое спаПИВО!
Go to the top of the page
 
+Quote Post
Vavan4ik
сообщение Mar 6 2009, 07:11
Сообщение #15





Группа: Участник
Сообщений: 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 результат положительный и неверный sad.gif((

Ничччего не понимаюююю
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 12:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01473 секунд с 7
ELECTRONIX ©2004-2016