Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CBuilder - работа с битовыми данными

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть прибор, с котрого получаю данные юзая dll-драйвер
 
используя функцию GetFelixStatus получаю структуру

Код:
 
typedef unsigned char byte;  
typedef unsigned short int word;  
 
struct frfFelixStatus {  
  byte ErrorCode; // 1 байт hex
  byte HardStatus; // 1 байт бинар
  word CurrentStatus; // 2 байта бинар
  byte PrinterStatus; // 1 байт бинар
};
 

в итоге получаю frfStatus.HardStatus равен 136, перевожу (пока калькулятором) в бин, получаю 10001000 и смотря на таблицу, где раписан каждый бит вижу статус
frfStatus.CurrentStatus получается 6160, что в переводе в бин 1 1000 0001 0000, т.е. не хватает 3х нулей впереди, до полной тетрады
 
Но проблема не в нулях, а вот в чем:
 
Как лучше всего организовать проверку битов ?

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 01:03 02-04-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike

Цитата:
Как лучше всего организовать проверку битов ?

Примерно так:

Код:
 
#define _1ST_FLAG 1 // 00000001
#define _2ND_FLAG 2 // 00000010
....
#define _8TH_FLAG 128 // 10000000
 

 
И дальше проверка:
 

Код:
 
if (frfStatus.HardStatus & _1ST_FLAG) {
...
}
 
if (frfStatus.HardStatus & _2ND_FLAG) {
...
}
 



----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:01 02-04-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а как это будет работать с двухбатовым типом данных и вообще, как это будет работать
 
плиз опиши

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 01:09 03-04-2004
Dust



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
spike
ПРо align не забудь!

Всего записей: 460 | Зарегистр. 01-03-2002 | Отправлено: 03:01 03-04-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike

Цитата:
а как это будет работать с двухбатовым типом данных и вообще, как это будет работать

А какая разница?

Код:
 
#define _2B_1ST_FLAG 1 // 0000000000000001
...
#define _2B_9TH_FLAG 256 // 0000000100000000
....
#define _2B_LAST_FLAG 32768 // 1000000000000000
...
 
if (frfStatus.CurrentStatus & _2B_9TH_FLAG) {
...
}
 

 
Dust

Цитата:
ПРо align не забудь!

Ты о чем? Что структура на самом деле не 5 байт?

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 10:00 03-04-2004 | Исправлено: f_serg, 10:00 03-04-2004
DaKKoN



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Я, может быть, торможу, но разве так не проще?

Код:
if ( frfStatus.CurrentStatus & (1<<n) )
{
...
}

где n - номер бита, который надо проверить.
Во избежание недоразумений со стороны компилятора, можно явно указать тип единицы (1UL, например).
Это, конечно, если для нас не жизненно важна скорость и программируем мы не для микроконтроллера.

Всего записей: 11 | Зарегистр. 21-09-2002 | Отправлено: 20:01 08-04-2004 | Исправлено: DaKKoN, 20:04 08-04-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DaKKoN

Цитата:
но разве так не проще?

Проще. А у меня - нагляднее. Да и флаги можно информативно обозвать. В общем, выбирать spike-у.


----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 06:19 09-04-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ты о чем? Что структура на самом деле не 5 байт?

При align > 1 байт размер структура больше 5 байт, а точнее 6.

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 13:13 09-04-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если я буду проверять 2х батное число проверять надо писать так:

Код:
if ( frfStatus.CurrentStatus & (2UL << n) )  
{  
...  
}

 
... или как ???

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 16:37 13-04-2004
Tartrout



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
так и будешь писать. Сделай только явное преобразование типов

Всего записей: 316 | Зарегистр. 24-07-2002 | Отправлено: 18:34 13-04-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tartrout
что значит явно преобразование ?

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 13:18 14-04-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
spike

Цитата:
if ( frfStatus.CurrentStatus & (2UL << n) )  
{  
...  
}

А почему 2? И зачем UL? У тебя же unsigned short или word.

Код:
if (frfStatus.CurrentStatus & (word) (1 << n))
{
...
}


----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 13:45 14-04-2004
spike



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f_serg
может поэтому и получается такая хе..я:
 
получаю число 6256 -> 1-1000-0111-0000, т.е. плюс 3 нулю с переди и все было бы окей
но почему-то проверяется: 0000-1100-0011-1000
 
т.е. чего-то как-то сдвинулось в середину
 
попробую
Код:
if (frfStatus.CurrentStatus & (word) (1 << n))  
{  
...  
}  

может что-то изменится
 
Добавлено
f_serg
получилось - биг сенькс

Всего записей: 693 | Зарегистр. 23-10-2003 | Отправлено: 10:18 15-04-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CBuilder - работа с битовыми данными


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru