Перейти к содержанию
    

Битовые поля и указатели

Всем добра. Достался в наследие чужой код. Необходимо его привести в удобо-варимый вид. Есть куски, которые повторяются по несколько раз, только с разными переменными. Хотел заменить эти места функциями, но вот проблема, используются переменные в виде структур с битовыми полями типа: system.onoff и не получаются по указателю передать такие переменные в функцию, поскольку у структур адрес имеется, а у битового поля его нет. Вопрос как обычно поступают в таких случаях?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумеетя передают указатель на стуктуру

Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если структура глобальная, то и передавать не надо. И так известно. Я так делаю.

Если надо в функцию передать битовое поле, параметр функции задаю как int (иногда bool), а передаю значение поля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо передам я указатель на структуру &system. Как потом в функции мне присвоить битовому полю структуры onoff 0 или 1?

Примерно так

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 .

Изменено пользователем Herz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раньше была структура с битовыми полями

и чтобы изменить в ней бит накладывалась маска.

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раньше была структура с битовыми полями

и чтобы изменить в ней бит накладывалась маска.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 


blockcontrol control;

((uint16)control) |= 0x00010002;

if(control.enable5)
{...}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 


blockcontrol control;

((uint16)control) |= 0x00010002;

if(control.enable5)
{...}

Да было сделано примерно так. Вот теперь разгребаю, мучаюсь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А теперь не нужно накладывать маску. Теперь каждая ваша структура занимает ровно один байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да было сделано примерно так. Вот теперь разгребаю, мучаюсь...

 

struct{

uint8_t enable :1;

uint8_t disable :1;

} blockcontrol[8];

 

if( !blockcontrol[5].disable )

blockcontrol[5].enable = TRUE;

 

И Вы, это самое..... почитайте что-нибудь хотя-бы их самых языковых основ а то как бы из "разгребания" не получилось перемешивание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слыхал я, что стандартом не гарантировано, что биты битового поля непременно должны быть представлены в памяти именно битами.

Так нагло накладывать маску - это вообще за гранью моего понимания! Я бы даже такого не придумал никогда наверно))

Слава Богу компиляторы делают адекватные люди и UB часто реализуется наиболее логичным и ожидаемым способом...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слыхал я, что стандартом не гарантировано, что...

Никому это больше не говорите - это абсолютно секретная информация! :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...