Модераторы: 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   Вверх
Страницы: (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.1178 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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