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

Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1?
ViKo
Если структура глобальная, то и передавать не надо. И так известно. Я так делаю.
Если надо в функцию передать битовое поле, параметр функции задаю как int (иногда bool), а передаю значение поля.
mcheb
Цитата(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 .
sidy
Раньше была структура с битовыми полями
и чтобы изменить в ней бит накладывалась маска.
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?
zltigo
QUOTE (sidy @ Feb 3 2016, 18:11) *
Раньше была структура с битовыми полями
и чтобы изменить в ней бит накладывалась маска.

Какая такая маска??? Вы вообще о чем?

CrimsonPig
Цитата(zltigo @ Feb 3 2016, 16:56) *
Какая такая маска??? Вы вообще о чем?


Да эти дятлы, небось делали следущее:

CODE


blockcontrol control;

((uint16)control) |= 0x00010002;

if(control.enable5)
{...}

sidy
Цитата(CrimsonPig @ Feb 3 2016, 20:04) *
Да эти дятлы, небось делали следущее:

CODE


blockcontrol control;

((uint16)control) |= 0x00010002;

if(control.enable5)
{...}


Да было сделано примерно так. Вот теперь разгребаю, мучаюсь...
Сергей Борщ
А теперь не нужно накладывать маску. Теперь каждая ваша структура занимает ровно один байт.
zltigo
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;

И Вы, это самое..... почитайте что-нибудь хотя-бы их самых языковых основ а то как бы из "разгребания" не получилось перемешивание.
sigmaN
Слыхал я, что стандартом не гарантировано, что биты битового поля непременно должны быть представлены в памяти именно битами.
Так нагло накладывать маску - это вообще за гранью моего понимания! Я бы даже такого не придумал никогда наверно))
Слава Богу компиляторы делают адекватные люди и UB часто реализуется наиболее логичным и ожидаемым способом...
zltigo
QUOTE (sigmaN @ Feb 4 2016, 00:17) *
Слыхал я, что стандартом не гарантировано, что...

Никому это больше не говорите - это абсолютно секретная информация! sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.