Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2015, 11:28   #1
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию Си. Работа с битовыми полями

Здравствуйте!

Есть структура flags с битовыми полями. Структура это входит в объединение regs

Есть цикл, который перебирает элементы массива и при выполнении некоторого условия, цикл должен записывать единицу в битовое поле, соответствующее элементу массива.

Так как битовые поля в виде массива я представить не могу, задумал представить их в виде односвязного списка вида

Код:
struct _node_ {
	unsigned int pz:1;
	struct _node_ *next;
};
Объявляю объединение и пытаюсь статически инициализировать список

Код:
struct _node_ pz[4]={
	{regs.data.flags.pz1, &pz[1]},
	{regs.data.flags.pz2, &pz[2]},
	{regs.data.flags.pz3, &pz[3]},
	{regs.data.flags.pz4, NULL},
};
На что компилятор резонно начинает ругаться, мол, переменные pz1..pz4 не определены

Подскажите, пожалуйста, куда можно двигаться дальше? Возможно работать с битовыми полями в рамках такой задачи через битовый сдвиг?
Bayern_M вне форума Ответить с цитированием
Старый 06.04.2015, 13:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
Так как битовые поля в виде массива я представить не могу, задумал представить их в виде односвязного списка вида
То у вас структура/объединение как элемент, то вдруг битовые поля...

Если у вас есть, например, структура с битовыми полями как элемент, то можно создать массив структур и т.д.
Если у вас есть массив каких-то объектов и битовые поля, соответствующие им, то не надо битовые поля пихать в массив. Просто установите соответствие между номер элемента в массиве и номер бита в битовом поле. Например, прямо 0 элемент - 0 бит,..
p51x вне форума Ответить с цитированием
Старый 06.04.2015, 13:16   #3
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
То у вас структура/объединение как элемент, то вдруг битовые поля...

Если у вас есть, например, структура с битовыми полями как элемент, то можно создать массив структур и т.д.
Если у вас есть массив каких-то объектов и битовые поля, соответствующие им, то не надо битовые поля пихать в массив. Просто установите соответствие между номер элемента в массиве и номер бита в битовом поле. Например, прямо 0 элемент - 0 бит,..
У меня есть объединение regs. В ней большая структура data. В data помимо прочего массив float элементов и структура flags, которая состоит из однобитовых полей. Если у меня элемент массива float больше определенного значение, то мне нужно менять значение соответствующего ему бита во flags

Думаю использовать маску. Ведь, перебирая массив float, мы узнаем индекс элемента. Значит дальше по идее надо в i-ый бит маски положить 1 или 0 и применить or или and к flags.

Правильный ход мыслей?
Bayern_M вне форума Ответить с цитированием
Старый 06.04.2015, 13:59   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
Думаю использовать маску. Ведь, перебирая массив float, мы узнаем индекс элемента. Значит дальше по идее надо в i-ый бит маски положить 1 или 0 и применить or или and к flags.
Какую маску? У вас же битовые поля? Или у вас просто инт/лонг и в нем биты?
p51x вне форума Ответить с цитированием
Старый 06.04.2015, 14:16   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Если нужен только набор битов (до 32 шт), то достаточно только ULONG. Без всяких структур.
А на паскале я бы написал класс с множеством и не мучался. На сях можно и даже нужно изобразить нечно подобное по функциональности.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2015, 14:39   #6
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Какую маску? У вас же битовые поля? Или у вас просто инт/лонг и в нем биты?
Код:
struct _flags_ {				/*Регистр флагов*/ 
	unsigned int pz1:1;			
	unsigned int pz2:1;			
	unsigned int pz3:1;
	unsigned int pz4:1;
	unsigned int az1:1;			
	unsigned int az2:1;
	unsigned int az3:1;
	unsigned int az4:1;
	unsigned int reserve:8;         /*Зарезервированное место*/  
};

struct _data_{
                ...
		float 				bd_val[4];				
		struct _flags_ 		flags;	
                ...				
};

union _regs_ {
	short int 		area[0x281];
	struct _data_ 	data;
};
Пример, если regs.data.bd_val[0] больше 0.5, то pz1=1. Если больше 0.8, то az1=1.
И обратно. Если bd_val[0] уменьшается, то pz или az переключаем в ноль
Bayern_M вне форума Ответить с цитированием
Старый 06.04.2015, 15:03   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Ну тогда без маски, ручками. Хотя на вашем месте я б запихнул бы в объединение битовые поля и uint16 и тогда б маской, да и маску проще от индекса сдвигом получать было б.
p51x вне форума Ответить с цитированием
Старый 06.04.2015, 15:06   #8
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Пока я вот на каком этапе. Сделал список вида

Код:
struct _node_ {
	float *val;
	struct _flags_ *flags;
	float *pz;
	float *az;
	struct _node_ *next;
};
Дальше хожу по списку и проверяю

Код:
if(p->val>=p->pz)
И дальше думаю нужно взять p->flags и xor-ом умножить на маску, в которой в нужную позицию засунуть единицу

Но как это сделать, пока не могу понять
Bayern_M вне форума Ответить с цитированием
Старый 06.04.2015, 15:10   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
И дальше думаю нужно взять p->flags и xor-ом умножить на маску, в которой в нужную позицию засунуть единицу
И получить в зависимости от компилятора и настроек либо по рукам, либо баги. У вас структура, а не инт. Многие компиляторы умеют упаковывать битовые поля в одно число, некоторые нет и в результате в структуре у вас будет несколько unsigned int по количеству битовых объявлений.
p51x вне форума Ответить с цитированием
Старый 06.04.2015, 15:19   #10
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И получить в зависимости от компилятора и настроек либо по рукам, либо баги. У вас структура, а не инт. Многие компиляторы умеют упаковывать битовые поля в одно число, некоторые нет и в результате в структуре у вас будет несколько unsigned int по количеству битовых объявлений.
Посоветуйте, пожалуйста, что можно придумать имея список на руках такой.

Голова кипит и глаз замылен переделывать через другую схему

Если введем индекс в список. Можно ли как-то так

Код:
node->flags=node->flags ^ (node->i << mask);
И mask задать 00000001

Последний раз редактировалось Bayern_M; 06.04.2015 в 15:28.
Bayern_M вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с полями типа BLOB LuckyDog21 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 05.01.2015 14:05
Работа с полями на форме. nat_lapulia Microsoft Office Access 14 01.02.2013 12:00
Создание шаблона и работа с полями olegrock Microsoft Office Word 6 26.11.2011 22:08
Работа с битовыми полями Farrel Общие вопросы C/C++ 13 20.02.2011 17:57
Interbase. Работа с BLOB-полями Sewell БД в Delphi 5 25.11.2010 08:46