Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать адрес битового поля 
:(
    Опции темы
Ivan.
Дата 19.7.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Цитата(bsa @  18.7.2007,  11:45 Найти цитируемый пост)
Что-то я опять не понял... А почему вариант с фигурными скобками тебя не устраивает? Или битовые поля инициализировать таким образом уже нельзя?
 непонял, где?



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
bsa
Дата 19.7.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я имел в виду это:
Код
const TMenuProp __Var1_Prop = { 1, 2, 3, 4, 5 };

PM   Вверх
Ivan.
Дата 20.7.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Цитата(bsa @  19.7.2007,  12:40 Найти цитируемый пост)
Я имел в виду это:

код C++
1:

const TMenuProp __Var1_Prop = { 1, 2, 3, 4, 5 };

Ты имеешь в виду:
Код

    u16 Next;//:13;    // Следующий пункт (8K)
//    u16 EditAcc:2;    // Доступ редактирования (0 - Открытый, 1 - Клиент, 2 - Мастер, 3 - Производитель)
//    u16 EditRun:1;    // Редактирование во время работы

или зачем мне брать адрес битового поля?
в первом варианте закоментарено, потому что тяжко преобразовать указатель к битовому полю, а к инту легко (в Next я должен положить указатель следующего пункта меню). и вообще это структура параметров меню, а не структура, каторой управляет меню. мне не ее тяжело заполнить, а взять адрес переменной, каторой потом буду управлять.
Пример:
struct T{
        int A;
        unsigned int B:1;
} t;
const TMenuProp __Var1_Prop = { "Имя", "", "Информация", &Var2, &Var0, &t, (u16)&t.B - (u16)&t, startbit(T::B), sizeofbit(T::B), 0, 1, 1, 0 };
TMenuVar Var1(&__Var1_Prop);



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
11Space11
Дата 20.1.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



есть такая задача:

приходит структура с битовыми полями
struct InStruct
{
  unsigned int a1:1;
  unsigned int a2:5;
  unsigned int a3:3;
  unsigned int a4:2;
  unsigned int a5:5;
  ...
  unsigned int an:1;
};

Структура потом идёт на обработку( от битовых полей строются графики, строятся таблицы и т.д. ),
причём пользователь может выбирать, например построение графиков от определённых полей.
Это приводит к тому, что адрес битового поля нужно передать как параметр в функцию.
Насколько мне известно, невозможно взять адрес битового поля.
Может кто-то подскажет правильное решение данной проблемы?

На ум приходит только создание парсера структуры, но как-то неправильно это, мне кажется.

PM MAIL   Вверх
feodorv
Дата 20.1.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(11Space11 @  20.1.2012,  15:18 Найти цитируемый пост)
На ум приходит только создание парсера структуры, но как-то неправильно это, мне кажется.

А что делать(((

Я вижу два варианта "решения" проблемы:

1/  завести свою структуру с подобными полями, но без битов:
Код

struct MyInStruct
{
  unsigned int a1;
  unsigned int a2;
  unsigned int a3;
  unsigned int a4;
  unsigned int a5;
  ...
  unsigned int an;
};

Затем тупо скопировать данные:
Код

void myCopy( struct MyInStruct *mis, struct InStruct *is)
{
  mis->a1 = is->a1;
  ...
  mis->an = is->an;
}

И оперировать дальше (для построения графиков и таблиц) своей структорой, в которой легко можно задать смещение нужного данного.
Недостаток метода - лишняя память и копирование данных.

2/ Создать подпрограмму по изъятию из структуры нужных данных:
Код

enum
{  
  NEED_A1,
  ...
  NEED_AN
};

unsigned int getValue( struct InStruct *is, int needed)
{
  switch( needed )
  {
    case NEED_A1:
       return is->a1;
    ...
    case NEED_AN:
       return is->an;
    default:
       return 0;
  }
}

И отправлять в функции построения таблиц и графиков нужную needed.
Недостаток метода - накладные расходы на case.

Иных выходов не вижу. Может, кто-то сумеет выйти через вход)))

ЗЫ Стоило создать новую тему...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kuzulis
Дата 20.1.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Насколько мне известно, невозможно взять адрес битового поля.

Невозможно.

Цитата

Это приводит к тому, что адрес битового поля нужно передать как параметр в функцию.
Может кто-то подскажет правильное решение данной проблемы?

Передавай не адрес - а значение.


PM MAIL   Вверх
Fynivx
Дата 20.1.2012, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



Это просто ужас. Вы пишете на C++, используете древовидное меню ( причем, дерево из списков ), и беспокоитесь о том, чтобы сэкономить память на использовании битовых полей?

Вы сэкономите намного ( в сотни раз, наверное ) больше, если откажетесь от этой навороченной архитектуры и сделаете простое статическое меню.

А насчет основного вопроса, опять же, статика - ваше спасение. Судя по началу топика, даже более, чем в каком либо другом случае. Вам не обязателен адрес поля, если вам нужны данные из него. Только адрес самой структуры и знание ее структуры) Значение любого битового поля с известным смещением и размером очень легко найти ( в универе этому не учили? )  <значение поля> = * <адрес структуры> & <значение равное по размеру структуре, с пустыми битами слева от поля и единицами в остальных битах> >> (<размер структуры> - <размер поля> - <к-во бит слева>)

например
Код

struct {
  unsigned int a1:1;
  unsigned int a2:5;
  unsigned int a3:2;
} example;

void* pointer = (void*) &example;
unsigned int a1 = (char) *pointer >> 7;
unsigned int a2 = ( (char) *pointer ) & 127 >> 2;
unsigned int a3 = ( (char) *pointer ) & 3;


Вот как-то так. Стоп. Я пропустил. А почему нельзя обратиться к полю как к полю, а не фигней страдать?
-------
А. Всё. Вижу. А зачем передавать адрес а не значение?


Это сообщение отредактировал(а) Fynivx - 20.1.2012, 17:39
PM MAIL   Вверх
feodorv
Дата 20.1.2012, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Fynivx @  20.1.2012,  17:22 Найти цитируемый пост)
если откажетесь от этой навороченной архитектуры и сделаете простое статическое меню.

Ээээ. Здесь так получилось, что 11Space11 использовал для нового вопроса старую тему(((
Его/её же вопрос здесь ;)


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Fynivx
Дата 20.1.2012, 17:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.8.2011

Репутация: нет
Всего: 1



А... Извините) Но последний вопрос ( и он уже был озвучен до меня ) остается в силе - почему нужно передавать указатель, а не значение?
PM MAIL   Вверх
feodorv
Дата 20.1.2012, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Fynivx @  20.1.2012,  17:43 Найти цитируемый пост)
почему нужно передавать указатель, а не значение? 

Не думаю, что именно указатель, может просто смещение. Просто есть набор однотипных данных, а пользователь может выбирать, по какому набору строить график или таблицу. Хочется реализовать это в функциях отрисовки однообразно: данные + смещение = значение. То есть, данные собираются в некоторую коллекцию, и именно эта коллекция передаётся функции отрисовки (сразу, целиком). Но что именно нужно отрисовывать из этих данных, определяется смещением ("адресом" конкретного битового поля в структуре данных). Получить значение, имея экземпляр структуры и смещение внутри этой структуры, быстро и элементарно для простых, небитовых полей. Для битовых полей это уже проблематично(((

Добавлено через 8 минут и 45 секунд
Кажется, я понял смысл Вашего вопроса))))

Можно ведь в фунцию отрисовки отправлять адрес подпрограммы, возвращающей нужное значение, типа:
Код

unsigned int getValue1( struct InStruct *is )
{
  return is->a1;
}
....
unsigned int getValueN( struct InStruct *is )
{
  return is->an;
}


Это очень хороший вариант решения)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
11Space11
Дата 23.1.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата

почему нужно передавать указатель, а не значение?


Я хочу только в одном месте цеплять структуру
, чтобы было легко менять.
что-то типа этого:

Код

class Element
{
  QString name;
  unsigned int *adress;
  unsigned int type;
}


Код


QVector<Element> vector;
Element elem(QString("Заданая передача"), &inStruct.a1, TYPE_INT_3);
vector.push_back( elem );
Element elem(QString("Текущая передача"), &inStruct.a2, TYPE_INT_3);
vector.push_back( elem );
...



Структура содержит около 300 полей( и она не одна ). Получается:
Надо построить графики от данных - надо набирать 300*n строк( где n ~ 3 )
Надо построить таблицы от данных - опять надо набирать 300*n строк.
понадобится еще что - то - опять надо набирать 300*n строк.
Полный бред!

Но это не самое страшное. Структура постоянно меняется.  Если добавить новое поле все смещения надо будет рассчитывать заново.
И никогда не узнаешь правильно ли ты рассчитал все смещения. Надо все поля проверять.






PM MAIL   Вверх
xvr
Дата 23.1.2012, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Еще вариант - отказаться от битовых полей и использовать целочисленные поля с набором битов внутри такого поля (использовать битовую арифметику: & | << >> )

PM MAIL   Вверх
11Space11
Дата 23.1.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата

Еще вариант - отказаться от битовых полей и использовать целочисленные поля с набором битов внутри такого поля (использовать битовую арифметику: & | << >> )


Не удобно.

Похоже придётся парсер препроцессором  делать.

Может кто-нибудь знает, что-нибудь готовое есть? 
PM MAIL   Вверх
mes
Дата 23.1.2012, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(11Space11 @  23.1.2012,  11:24 Найти цитируемый пост)
Структура содержит около 300 полей( и она не одна ). Получается:
Надо построить графики от данных - надо набирать 300*n строк( где n ~ 3 )
Надо построить таблицы от данных - опять надо набирать 300*n строк.
понадобится еще что - то - опять надо набирать 300*n строк.
Полный бред!

озвутьте общую задачу, а то непонятно чего Вы хотите.. 



--------------------
PM MAIL WWW   Вверх
feodorv
Дата 23.1.2012, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(11Space11 @  23.1.2012,  12:24 Найти цитируемый пост)
Структура содержит около 300 полей( и она не одна ).

Чем Вам не понравился вариант с функциями, возвращаюшими желаемое значение из структуры, вместо адреса/смещения? То есть типа такого:
Код

struct InStruct
{
  unsigned int a1:1;
  unsigned int a2:5;
  unsigned int a3:3;
  unsigned int a4:2;
  unsigned int a5:5;
  ...
  unsigned int an:1;
};

enum
{  
  NEED_A1 = 0,
  NEED_A2,
  NEED_A3,
  NEED_A4,
  NEED_A5,
  ...
  NEED_AN,
  NEED_LAST
};

unsigned int get_value_a1( struct InStruct *is )
{
  return is->a1;
}
unsigned int get_value_a2( struct InStruct *is )
{
  return is->a2;
}
unsigned int get_value_a3( struct InStruct *is )
{
  return is->a3;
}
unsigned int get_value_a4( struct InStruct *is )
{
  return is->a4;
}
unsigned int get_value_a5( struct InStruct *is )
{
  return is->a5;
}
...
unsigned int getValueN( struct InStruct *is )
{
  return is->an;
}

typedef unsigned int (*get_value_f)( struct InStruct *data, int needed)

get_value_f ftable[NEED_LAST] =
{
  get_value_a1,
  get_value_a2,
  get_value_a3,
  get_value_a4,
  get_value_a5,
...
  get_value_aN,
};

 
drawGraffic( vector &v, int needed)
{
  get_value_f getValue = ftable[needed];

  while( ... )
  {
     unsigned int d = getValue( v[i] );
     ...
  }
}


Собствеенно набор из 300 функций, таблицу функций, enum и другие описания можно генерить отдельной программой по описанию структуры InStruct.
Как то так...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.