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

Поиск:

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


Опытный
**


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

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



Наверное это глупый вопрос и я подозреваю, что это сделать невозможно, но всеже:
Необходимо на этапе компиляции получить (и записать в константу) адрес битового поля, номер начального бита и количество бит, как это сделать?


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



минимально адресуемая ячейка это байт.
Цитата

Необходимо на этапе компиляции получить (и записать в константу) адрес
в константу врядли возможно записать адрес на этапе компиляции (возможность __asm { constdata equ $} врядли возможна..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Doc_d0s
  Дата 15.7.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



можно по конкретнее с кусками кода...не уловил суть проблемы...
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
Ivan.
Дата 16.7.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

struct T
{
        int A:2;
        int B:6;
};
T t;
void *B = &t.B;
int dB = &t.B - &t;
int sB = sizeof(T::B);
int main()
{
        return 0;
}

чтото типа такого, только чтоб работало. естевственно это работать не будет, а вообще возможно получить такие данные?


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


Эксперт
****


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

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



Можно. Напиши класс BitFieldPointer...
PM   Вверх
threef
Дата 16.7.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Адрес битового поля сможешь получить экспериментально. Выглядеть он будет в виде адреса байта+ смещение в байте. Смещение как раз и получишь экспериментально:разложи битовое поле на биты, заполни нолями и затем - единицами. Лучше пользуйся беззнаковыми целыми. Использовать этот адрес сможешь адрес + операция сдвига. 
И нахрена это ? Ведь битовое поле для того и предназначено, чтобы не было головной боли со сдвигами...
PM MAIL   Вверх
bsa
Дата 16.7.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Зачем ставить эксперименты с положением бит? Их положение в байте строго определенное - бит 7 слева, бит 0 справа.

Это сообщение отредактировал(а) bsa - 16.7.2007, 21:49
PM   Вверх
threef
Дата 16.7.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

struct _2_byte {
   unsigned x:9,
                   y:4;
} aga;

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


Эксперт
****


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

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



Есть два варианта положений байт в слове: big endian (от старшего к младшему) и little endian (от младшего к старшему). На большинстве персональных компьютеров (x86) это little endian.
PM   Вверх
Ln78
Дата 17.7.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ivan., я когда-то писал несколько макросов и вспомогательных классов для структур типа:
Код

struct S0
{
    unsigned int x0 : 7;
    unsigned int x1 : 2;
    unsigned int x2 : 7;
};

struct S1
{
    unsigned int y0 : 3;
    unsigned int y1 : 2;
    unsigned int y2 :11;
};

struct SS
{
    float f1;
    float f2;
    S0      s0;    
    S1      s1;
};

SS ss[10];

с тем, чтобы использовать их при составлении множества нужных мне параметров примерно таким образом:
DATA_BIT_ARRAY("x0",ss,s0,x0);
Все нужные мне параметры я вводил вручную (в тексте программы), в результате заполнялось множество
std::map<std::string, TypeVariant*> Data; 
Ну и, собственно, были определены методы Get и Set - получения и присваивания значений. Если тебя интересует это, то я на днях подготовлю тебе файлы с макросами и примером их использования

Это сообщение отредактировал(а) Ln78 - 17.7.2007, 09:46
PM MAIL   Вверх
Ivan.
Дата 17.7.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все это не то, мне нужно получить данные на этапе компеляции, а не во время работы программы.
Я согласен хотябы узнать только адрес начального байта битовой переменной.
Код

struct T {
        unsigned A:4;
} t;
const void *A = &t.A;    // хранится в области кода




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


Опытный
**


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

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



Цитата(Ivan. @  17.7.2007,  09:56 Найти цитируемый пост)
мне нужно получить данные на этапе компеляции,

Что ты понимаешь под данными? С помощью макросов как раз и получаются адрес целой переменной и маска, по которой находится то или иное битовое поле. И это всё, естественно, становится известно на этапе компиляции, я же просто заполняю исходный код такими макросами. Просто в той моей задаче эта информация использовалась, чтобы потом иметь возможность (уже в процессе выполнения задачи) получать или устанавливать нужные значения элементам структуры. Ведь и тебе эти данные нужны не просто так, ты же их потом как-то собираешься использовать?

Добавлено через 4 минуты и 6 секунд
Нет, я тебя обманул, вроде эти данные станут известны уже только в начале выполнения программы. Я уже точно не помню, относительно давно я этим занимался
PM MAIL   Вверх
bsa
Дата 17.7.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ivan. @ 17.7.2007,  09:56)
Все это не то, мне нужно получить данные на этапе компеляции, а не во время работы программы.
Я согласен хотябы узнать только адрес начального байта битовой переменной.
Код

struct T {
        unsigned A:4;
} t;
const void *A = &t.A;    // хранится в области кода

Есть у меня подозрение, что ты где-то накосячил на этапе проектирования. Нет никакого смысла получать адрес на этапе компиляции, так как на этапе компиляции ты можешь напрямую обращаться к полям структуры тем самым получая доступ к данным.
Лучше объясни, зачем тебе это надо, и кто-нибудь скажет, как это правильно можно реализовать.
PM   Вверх
Ivan.
  Дата 18.7.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Первое, что я хочу уточнить: у меня процессор не X86, а микроконтроллер и по этому там особо не разгонишься. Мне нужно получить как можно больше информации еще на этапе компиляции, сформировать какую то структуру, чтобы потом быстро ее обрабатывать.
И так, задача у меня такая:
Нужно построить такую иерархию, каторая позволяла бы легко строить структурированное меню (меню отображения информации, настройки параметров и т.д.).
есть класс:
Код

class TMenu
{
protected:
    const TMenuProp *Prop;
    TMenu *Parent;
    ....
    inline TMenu(const TMenuProp *prop) :    Prop(prop), Parent(0) {}
public:
    virtual TMenu *Proc(EKeys Key);
};
 
От этого класса потом плодятся подклассы типа TMenuVar, TMenuCombo, TMenuClock, TMenuPasword, TMenuBin, ...
А вся информация чем и как эти классы должны управлять и отображать находится в структуре TMenuProp.
Эта структура содержит такой вид:
Код

struct TMenuProp {
    u16 Name;    // Название переменной или меню
    u16 Pref;        // Префикс или список Combo
    u16 Info;        // Информация
    u16 Next;//:13;    // Следующий пункт (8K)
//    u16 EditAcc:2;    // Доступ редактирования (0 - Открытый, 1 - Клиент, 2 - Мастер, 3 - Производитель)
//    u16 EditRun:1;    // Редактирование во время работы
    u16 Prev;//:13;    // Предыдущий пункт (8K)
//    u16 ViewAcc:2;    // Доступ просмотра      (0 - Открытый, 1 - Клиент, 2 - Мастер, 3 - Производитель)
//    u16 ViewRun:1;    // Просмотр во время работы
    u16 Adr;//:13;    // Адрес компаненты параметров или адрес вложенного пункта (8K)
//    u16 Sign:1;    // Знаковое число
//    u16 Volatile:1;    // Обновлять значение в памяти
//    u16 ReadOnly:1;    // Только для чтения
    u8  Offset;    // Смешение от начала компаненты в байтах
    u8  Bit;//:3;    // Начиная с бита
//    u8  Bits:5;    // Количество бит в переменной = 32 - Bits
    u32 Min;        // Минимальное значение
    u32 Max;        // Максимальное значение
    u16 Div;        // Делитель
    u8  Dot;//:3;    // Знаков после запятой
//    u8  Size:5;    // Размер строкового поля для ComboBox
};

Для каждого пункта меню мне нужно сформировать такую структуру и положить ее в область кода (потому что в оперативку, объемем в 4K, это все не влезет)
пример:
Код

const TMenuProp __Var1_Prop = { ..., ..., ..., ..., ... };
TMenuVar Var1(&__Var1_Prop);

Естевственно есть макросы по заполнению этой структуры (объединение параметров, и т.д.)
Но когда вопрос встает об указании битового поля приходится брать чтото радом лежащее, говорить, что от этого адреса еще на пару байт вперед, там лежит от 4 бита на протяжении 3 бит переменная. Геморройно!
Вот я и хочу написать какой нибудь макрос, каторый би раскладывал бы это все по полочкам.


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


Эксперт
****


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

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



Что-то я опять не понял... А почему вариант с фигурными скобками тебя не устраивает? Или битовые поля инициализировать таким образом уже нельзя?
PM   Вверх
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   Вверх
mes
Дата 23.1.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(feodorv @  23.1.2012,  17:20 Найти цитируемый пост)
Чем Вам не понравился вариант с функциями, возвращаюшими желаемое значение из структуры, вместо адреса/смещения? То есть типа такого:

и еще столько же сеттеров..


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


Эксперт
****


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

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



Цитата(mes @  23.1.2012,  18:42 Найти цитируемый пост)
и еще столько же сеттеров.. 

Точно!))) Правда, если структуру формирушь сам...

Я вот было подумал вначале, что структура чужая, данные берутся из чёрного ящика, и деваться некуда. Но:
Цитата(11Space11 @  23.1.2012,  13:59 Найти цитируемый пост)
Не удобно.

Значит, всё-таки структура своя...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
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.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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