Полная версия этой страницы:
Битовые поля и указатели
Всем добра. Достался в наследие чужой код. Необходимо его привести в удобо-варимый вид. Есть куски, которые повторяются по несколько раз, только с разными переменными. Хотел заменить эти места функциями, но вот проблема, используются переменные в виде структур с битовыми полями типа: system.onoff и не получаются по указателю передать такие переменные в функцию, поскольку у структур адрес имеется, а у битового поля его нет. Вопрос как обычно поступают в таких случаях?
zltigo
Jan 28 2016, 12:03
Разумеетя передают указатель на стуктуру
Цитата(zltigo @ Jan 28 2016, 15:03)

Разумеетя передают указатель на стуктуру
Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1?
Если структура глобальная, то и передавать не надо. И так известно. Я так делаю.
Если надо в функцию передать битовое поле, параметр функции задаю как int (иногда bool), а передаю значение поля.
Цитата(sidy @ Jan 28 2016, 15:16)

Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1?
Примерно так
CODE
struct FlashProg_t
{
uint8_t ind;
uint8_t desc;
uint8_t __code *descriptor;
uint8_t (*flInit)(void);
uint8_t (*flUnProtect)(void);
uint8_t (*flRead)(void);
uint8_t (*flErase)(void);
uint8_t (*flWrite)(void);
uint8_t (*flVerify)(void);
uint8_t (*flProtect)(void);
uint8_t (*flExit)(void);
};
void printFlashHelp(void)
{
uint8_t i;
__code struct FlashProg_t* Fun;
union
{
uint8_t *a8;
uint16_t *a16;
uint16_t d16;
} aFun;
printf("\n\r");
printf(" H - HELP\n");
aFun.d16 = FUNCROM;
for(i=0; i < MAX_USER_PROGRAM; i++)
{
// printf("Check adr %04X %04X\n",aFun.d16,*aFun.a16);
Fun = (__code struct FlashProg_t*)(*aFun.a16);
if(*aFun.a8 != 0xFF)
{
printf("%c - %s\n",Fun->ind,Fun->descriptor);
};
aFun.a8 += 3;
}
printf(" Q - QUIT\n");
}
Через Fun->descriptor .
Раньше была структура с битовыми полями
и чтобы изменить в ней бит накладывалась маска.
struct{
enable1 :1;
enable2 :1;
enable3 :1;
enable4 :1;
enable5 :1;
enable6 :1;
enable7 :1;
enable8 :1;
disable1 :1;
disable2 :1:
disable3 :1:
disable4 :1:
disable5 :1:
disable6 :1:
disable7 :1:
disable8 :1:
} blockcontrol;
Теперь необходимо использовать массив структур из битовых
полей:
struct{
enable :1;
disable :1;
} blockcontrol[8];
поэтому возник вопрос как теперь накладывать маску что изменить,
например бит blockcontrol[5].enable?
QUOTE (sidy @ Feb 3 2016, 18:11)

Раньше была структура с битовыми полями
и чтобы изменить в ней бит накладывалась маска.
Какая такая маска??? Вы вообще о чем?
CrimsonPig
Feb 3 2016, 17:04
Цитата(zltigo @ Feb 3 2016, 16:56)

Какая такая маска??? Вы вообще о чем?
Да эти дятлы, небось делали следущее:
CODE
blockcontrol control;
((uint16)control) |= 0x00010002;
if(control.enable5)
{...}
Цитата(CrimsonPig @ Feb 3 2016, 20:04)

Да эти дятлы, небось делали следущее:
CODE
blockcontrol control;
((uint16)control) |= 0x00010002;
if(control.enable5)
{...}
Да было сделано примерно так. Вот теперь разгребаю, мучаюсь...
Сергей Борщ
Feb 3 2016, 18:21
А теперь не нужно накладывать маску. Теперь каждая ваша структура занимает ровно один байт.
QUOTE (sidy @ Feb 3 2016, 19:21)

Да было сделано примерно так. Вот теперь разгребаю, мучаюсь...
struct{
uint8_t enable :1;
uint8_t disable :1;
} blockcontrol[8];
if( !blockcontrol[5].disable )
blockcontrol[5].enable = TRUE;
И Вы, это самое..... почитайте что-нибудь хотя-бы их самых языковых основ а то как бы из "разгребания" не получилось перемешивание.
Слыхал я, что стандартом не гарантировано, что биты битового поля непременно должны быть представлены в памяти именно битами.
Так нагло накладывать маску - это вообще за гранью моего понимания! Я бы даже такого не придумал никогда наверно))
Слава Богу компиляторы делают адекватные люди и UB часто реализуется наиболее логичным и ожидаемым способом...
QUOTE (sigmaN @ Feb 4 2016, 00:17)

Слыхал я, что стандартом не гарантировано, что...
Никому это больше не говорите - это абсолютно секретная информация!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.