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

 
 
> Почему не работает код?
DMD
сообщение May 16 2008, 17:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



Не могу понять - почему не работает код, когда тут вроде бы висеть нечему! Компилятор - CodeVision, славится своей тупизной в общении с типами данных. Контроллер - ATMega8535.
Почему-то вот такой код не работает:
Код
//....
typedef unsigned char byte;
typedef unsigned long int dword;

dword SID = 0L;

typedef struct
{
    byte extended_identifier;
    dword identifier;      //32 bit
    // data length:
    byte  dlc;
    byte  dta[8];
    // Acceptence Filter that enabled the reception
    byte  filhit;
    byte rtr;
} CanMessage;

...
//теперь необходимо сдвинуть идентификатор на 5 бит влево...
SID = (dword)(((dword)(msg.identifier)) << 5);      

//Вот тут и висим, непонятно почему...
//так как следующий оператор ничего в порт не выводит:

printf("Packet observed: SID=0x%04lX; data: ", SID);
for (i=0; i<=7; i++) printf("[0x%02X] ", msg.dta[i]);
printf("\n");      
LED_WORK = 0;
//...

Вот почему висим там? Чему там висеть-то??
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DMD
сообщение May 16 2008, 22:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



"нидецкие" printf - это чисто для отладки. Нормальный компилятор давно ищу и не могу найти, не подскажете?
SID = msg.identifier << 5; - так не пробовал, но боюсь, что на какой-нибудь косяк компилятора нарвусь... "Косяк" - потому что кто-то посчитал, что преобразование к int перед, к примеру, сдвигом - операция ненужная в целях экономии чертовой памяти... Поэтому вот такой код не работает (хоть и компилится на все 100%):

unsigned char t = 255;
unsigned f = t << 3;

И такая штука твориться только в CodeVision, я на ней неделю просидел - все не мог вдуплить чего там твориться... Пришлось копаться в ассемблере. ..


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение May 17 2008, 04:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850



Цитата(DMD @ May 17 2008, 01:46) *
unsigned char t = 255;
unsigned f = t << 3;
Хелп читать надо и по настройкам лазить! Советские инженеры блин...
Все правильно компилятор делает! Контроллер-то 8-ми битный! операции над int'ами занимают больше времени чем над char'ами. Хотите пример? Пожалуйста:
Код
;   char a,b,c;
;   a -> R17
;   b -> R16
;   c -> R19

;   a = b + c;
    MOV  R30,R19
    ADD  R30,R16
    MOV  R17,R30

;   a = (char)((int)a + (int)b);
    MOV  R26,R17
    LDI  R27,0
    SBRC R26,7
    SER  R27
    MOV  R30,R16
    LDI  R31,0
    SBRC R30,7
    SER  R31
    ADD  R30,R26
    MOV  R17,R30
Какой код будет работать быстрее? Может такты посчитаем?
Но если вам все равно на скорость, а хочется "правильности" то вам сюда:
Project -> Configure -> C compiler -> Code generation -> Promote char to int
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 17 2008, 10:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(DMD @ May 17 2008, 01:46) *
так не пробовал, но боюсь, что на какой-нибудь косяк компилятора нарвусь...
integer promotion rules распространяются на типы меньше int размером. В противном случае левая и правая части подвыражения приводятся к наибольшему типу, который у вас совпадает с типом результата. Так что тут приведение совершенно лишнее.
Цитата(Nick_Shl @ May 17 2008, 07:42) *
Советские инженеры блин...
Все правильно компилятор делает!
Как "правильно" - написано в стандарте. Нормальный компилятор для обоих ваших примеров должен был бы сгенерить одинаковый код. Теперь сравните код для такого примера:
Код
unsigned char a = 200;
unsigned char b = 200;

volatile unsigned int c = a + b;
volatile unsigned int d = (unsigned int)a + (unsigned int b);
По стандарту результаты должны быть идентичны. Также внимательно прочитайте пост №7 - там тоже очень красивый пример.
Цитата(Nick_Shl @ May 17 2008, 07:42) *
Контроллер-то 8-ми битный! операции над int'ами занимают больше времени чем над char'ами.
То есть вы считаете, что быстрый неправильный код лучше медленного, но правильного? Тогда каким инженером назвать вас? Индийским? Китайским?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DMD   Почему не работает код?   May 16 2008, 17:48
- - Qwertty   Цитата(DMD @ May 16 2008, 21:48) Вот поче...   May 16 2008, 18:26
- - DMD   Нее, тут все ОК, я тоже думал. Стоит long,width оп...   May 16 2008, 18:43
- - plombir   Кодtypedef unsigned long int dword; вот это я не п...   May 16 2008, 18:56
- - DMD   32 бита   May 16 2008, 19:45
|- - defunct   Цитата(DMD @ May 16 2008, 22:45) 32 бита ...   May 16 2008, 19:53
|- - defunct   Цитата(DMD @ May 17 2008, 01:46) "ни...   May 16 2008, 23:22
|- - Nick_Shl   Цитата(Сергей Борщ @ May 17 2008, 13:08) ...   May 17 2008, 14:30
- - WHALE   да,все правильно,только имхо галочку они неправиль...   May 17 2008, 07:12
- - WHALE   Насколько я знаю,многие компиляторы допускают возм...   May 17 2008, 10:18
- - WHALE   Цитата(Nick_Shl @ May 17 2008, 18:30) Я с...   May 17 2008, 16:16
|- - Nick_Shl   Цитата(WHALE @ May 17 2008, 19:16) а си п...   May 17 2008, 16:37
- - WHALE   а я по книжкам.Кстати-у нас с вами одна библия. о...   May 17 2008, 17:02
- - DMD   Спасибо, ребята, за помощь. В понедельник на обору...   May 17 2008, 19:37
- - DMD   Ребят, а последней версии CodeVision у вас нет с л...   May 18 2008, 07:28
|- - Nick_Shl   Цитата(DMD @ May 18 2008, 10:28) Ребят, а...   May 18 2008, 07:58
- - WHALE   Цитата(DMD @ May 18 2008, 11:28) Ребят, а...   May 18 2008, 07:49


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

 


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


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