|
Почему не работает код? |
|
|
|
May 16 2008, 17:48
|

Частый гость
 
Группа: Свой
Сообщений: 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; //... Вот почему висим там? Чему там висеть-то??
|
|
|
|
|
 |
Ответов
|
May 17 2008, 04:42
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 17 2008, 10:08
|

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