|
ANSI С |
|
|
|
Apr 29 2011, 08:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
a] Есть переменная "Keys" с типом long long (64bits), в алгоритме понадобилось выставить в единички все разряды. Правильно ли я делаю: Код typedef unsigned long long INT64U; /* Unsigned 64 bit value */ ... Keys = ~(INT64U)0; b] Можно ли использовать MODE_CONTR в качестве ключа в свиче? Ругается компилятор однако.. Код #define MODE_CONTR 1;
... void FSMGeneral (void) {
switch (Mode) { case MODE_CONTR: if (MsgGetMessage (MSG_SEND_COMMAND) == 1) { switch (Get_Type_Commands (Keys)) { ...
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Apr 29 2011, 09:30
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Буратино @ Apr 29 2011, 14:48)  b] Можно ли использовать MODE_CONTR в качестве ключа в свиче? Ругается компилятор однако.. Код #define MODE_CONTR 1; Он на точку с запятой ругается.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 29 2011, 10:10
|

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

|
QUOTE (Буратино @ Apr 29 2011, 11:48)  a] Есть переменная "Keys" с типом long long (64bits), в алгоритме понадобилось выставить в единички все разряды. Правильно ли я делаю: CODE typedef unsigned long long INT64U; /* Unsigned 64 bit value */ ... Keys = ~(INT64U)0; Да, правильно. Еще возможен вариант Keys = (INT64U)-1; А еще можно использовать stdint.h и тогда не придется определять свои типы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 5 2011, 12:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Есть такая функция: Код ... typedef unsigned long INT32U; /* Unsigned 32 bit value */ INT32U Leds; ... void set_bit (INT08U number) { Leds = 0; Leds |= (1 << number); } ... Если аргумент больше чем 0x0E, то получаю странные результаты. В чем может быть причина? Спасибо!
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
May 5 2011, 12:40
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Буратино @ May 5 2011, 15:27)  Если аргумент больше чем 0x0E, то получаю странные результаты. В чем может быть причина? Спасибо! Видимо у вас int имеет разрядность 16 бит. Таким образом 1, которая имеет тип инт, при сдвиге переполняется и получается 0, хотя вы ожидаете 1 в старших разрядах. Лечится очень просто - укажите что 1 у вас не инт, а лонгинт. Код Leds |= (1UL << number);
|
|
|
|
|
May 5 2011, 12:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Буратино @ May 5 2011, 16:45)  Спасибо мужики ,все зафурычило!  Буду иметь в виду. Совет господину Буратино: открыть файл limits.h и посмотреть, какие типы переменных какие имеют размерности в его конкретном случае. Или один раз написать тест со всеми основными типами типа: Код printf("int - %d bytes\n", sizeof(int)); Многое прояснится.
|
|
|
|
|
May 21 2011, 15:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Файлов limits.h куча, на какой именно смотреть? Скажите, поддерживается ли стандартом тип long long? Запутался окончательно  Вот мои типы данных: Код typedef unsigned char BOOLEAN; /* Logical data type (TRUE or FALSE) */ typedef unsigned char CHAR; /* Unsigned 8 bit character */ typedef unsigned char INT08U; /* Unsigned 8 bit value */ typedef signed char INT08S; /* Signed 8 bit value */ typedef unsigned short INT16U; /* Unsigned 16 bit value */ typedef signed short INT16S; /* Signed 16 bit value */ typedef unsigned long INT32U; /* Unsigned 32 bit value */ typedef signed long INT32S; /* Signed 32 bit value */ typedef unsigned long long INT64U; /* Unsigned 64 bit value (if available) */ typedef signed long long INT64S; /* Signed 64 bit value (if available) */ typedef float FP32; /* 32 bit, single prec. floating-point */ typedef double FP64; /* 64 bit, double prec. floating-point */ IAR C/C++ Compiler for AVR 5.51.0 (5.51.0.50312) C:\Program Files\IAR Systems\Embedded Workbench 5.4\avr\bin\iccavr.exe 02.11.2010 18:30:10, 11751424 bytes Вот такая фигня восемь раз "бибикает" Код for (i=0; i<sizeof(long long);i++){ TmrFlagBeeper = 1; Delay_mSeconds(250); TmrFlagBeeper = 0; Delay_mSeconds(250); }
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
May 21 2011, 15:40
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Буратино @ May 21 2011, 19:21)  Скажите, поддерживается ли стандартом тип long long? Запутался окончательно  под ANSI принято понимать стандарт 89 года ansi, он же стандарт 90 года iso - в нём нет такого типа, не поддерживается (если поставить -strict в gcc, получишь отлуп) а вот в стандарте iso от 99 года long long появился, в нём поддерживается
|
|
|
|
|
May 21 2011, 16:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Не знаю, что там за стандарты, но с long long одни траблы  есть внешняя переменная Код extern INT64U RFID_Card; ее значением в конкретном месте программы является 0x0000000000B8BFD6 пытаюсь выполнить проверку: Код if( (INT64U)RFID_Card == 0x0000000000B8BFD6) {... if( (INT64U)RFID_Card == 0x0000000000B8BFD6ULL) {... if( (INT64U)RFID_Card == (INT64U)0x0000000000B8BFD6ULL) {... но адекватно работает только: Код if( (INT32U)RFID_Card == 0x00B8BFD6) {... куда копать?
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
May 22 2011, 15:02
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
«Какой такой козырёк?» Код #include <stdint.h> extern uint64_t RFID_Card; extern uint8_t aaa; void foo() { if (RFID_Card == 0x0000000000B8BFD6ULL) ++aaa; } IAR C/C++ Compiler for AVR 5.51.1 (5.51.1.50326) Код 192 void foo() \ ??foo: 193 { \ 00000000 2E08 MOV R0, R24 194 if (RFID_Card == 0x0000000000B8BFD6ULL) ++aaa; \ 00000002 .... LDI R30, LOW(RFID_Card) \ 00000004 .... LDI R31, (RFID_Card) >> 8 \ 00000006 8100 LD R16, Z \ 00000008 8111 LDD R17, Z+1 \ 0000000A 8122 LDD R18, Z+2 \ 0000000C 8133 LDD R19, Z+3 \ 0000000E 8144 LDD R20, Z+4 \ 00000010 8155 LDD R21, Z+5 \ 00000012 8166 LDD R22, Z+6 \ 00000014 8177 LDD R23, Z+7 \ 00000016 .... LDI R30, LOW(__Constant_b8bfd6_0) \ 00000018 .... LDI R31, (__Constant_b8bfd6_0) >> 8 \ 0000001A ........ CALL ?LL_CMP_L12 \ 0000001E F429 BRNE ??foo_1 \ 00000020 9100.... LDS R16, aaa \ 00000024 9503 INC R16 \ 00000026 9300.... STS aaa, R16 195 } \ ??foo_1: \ 0000002A 2D80 MOV R24, R0 \ 0000002C 9508 RET \ In segment NEAR_ID, align 1, keep-with-next \ `?<Initializer for 64 Bit Constant>_0`: \ 00000000 BFD600B80000 DD 12107734, 0 \ 0000
\ In segment NEAR_I, align 1, keep-with-next \ 00000000 REQUIRE `?<Segment init: NEAR_I>` \ __Constant_b8bfd6_0: \ 00000000 DS8 8 \ 00000008 REQUIRE `?<Initializer for 64 Bit Constant>_0`
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 23 2011, 05:59
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Еще одна интересная особенность: если я объявляю и инициализирую автоматическую переменную INT64U Temp_RFID_Card = 0; а затем присваиваю ей значение RFID_Card, то что либо вменяемое получить уже не могу ни там ни там. Скажите, может быть у меня траблы с размером стека или еще что-то в этом духе? Как поправить или проверить это дело? Код extern INT64U RFID_Card;
void main (void) {
INT64U Temp_RFID_Card=0; INT08U i;
InitDevice();
while(1) {
if(RFIDGetCard() == 1) { // Если функция возвращает 1, то код карты получен и он записан в глобальную переменную RFID_Card
Temp_RFID_Card=RFID_Card;
UARTTransmitByte (0x55); // метка for(i=0; i<8; i++) { UARTTransmitByte ((INT08U) RFID_Card); RFID_Card >>= 8; } UARTTransmitByte (0x33); // метка for(i=0; i<8; i++) { UARTTransmitByte ((INT08U) Temp_RFID_Card); Temp_RFID_Card >>= 8; } ... если заремить некоторые строки то все чики-пики Код extern INT64U RFID_Card;
void main (void) {
// INT64U Temp_RFID_Card=0; INT08U i;
InitDevice();
while(1) {
if(RFIDGetCard() == 1) { // Если функция возвращает 1, то код карты получен и он записан в глобальную переменную RFID_Card
// Temp_RFID_Card=RFID_Card;
UARTTransmitByte (0x55); // метка for(i=0; i<8; i++) { UARTTransmitByte ((INT08U) RFID_Card); RFID_Card >>= 8; } // UARTTransmitByte (0x33); // метка // for(i=0; i<8; i++) { // UARTTransmitByte ((INT08U) Temp_RFID_Card); // Temp_RFID_Card >>= 8; // } ...
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|