Здравствуйте, orbital, Вы писали:
O>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
Нет.
Re[2]: Адрес битового поля
От:
Аноним
Дата:
30.11.05 18:32
Оценка:
O>>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
A>Нет.
А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?
Здравствуйте, Аноним, Вы писали:
А>А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?
Здравствуйте, <Аноним>, Вы писали:
O>>>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
A>>Нет.
А>А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?
адрес элементе vector<bool> взять можно НО функция vector<bool>::возвращаетобъект , который только имитирует ссылку на отдельный бит.
В связи с этим vector<bool> не является полноценным контейнером в STL и спецификация для него особо оговорена в Стандерте.
"ComeauTest.c", line 11: error: expression must be an lvalue or a function
designator
cout << &bv[0] << '\n';
1 error detected in the compilation of "ComeauTest.c".
Хотя, справедливости ради нужно сказать, что некоторые компиляторы (не будем показывать пальцем) позволяют брать адрес r-value.
R>...НО функция vector<bool>::возвращаетобъект , который только имитирует ссылку на отдельный бит. R>В связи с этим vector<bool> не является полноценным контейнером в STL и спецификация для него особо оговорена в Стандерте.
А вот тут все верно
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Radmir, B>Хотя, справедливости ради нужно сказать, что некоторые компиляторы (не будем показывать пальцем) позволяют брать адрес r-value.
Извиняюсь, был не прав. В свое оправдяние могу сказать, что я являюсь как раз обладателем такого компилятора. И при попытке взять адрес все работало.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re: Адрес битового поля
От:
Аноним
Дата:
01.12.05 09:36
Оценка:
Здравствуйте, orbital, Вы писали:
O>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
Указатель (адрес, etc) это порядковый номер байта где-то (стек, куча...). Для представления "адреса" бита нужно два числа — указатель на байт и номер бита в байте.
struct bitptr
{
void* byte;
unsigned short bit; // (следить чтобы от [0,7])
};
Дальше вобщем не сложно. Инициализация — двумя копиями структуры, отличающимися лишь значением интересующего поля. Додуматься можно. Поменять значение бита в байте, зная порядок — тривиальная задача... Только вот вопрос — кому этот весь изврат нужен ? Наверняка можно что-то где-то поменять и сразу буит щастье.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, orbital, Вы писали:
O>>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
А>Указатель (адрес, etc) это порядковый номер байта где-то (стек, куча...). Для представления "адреса" бита нужно два числа — указатель на байт и номер бита в байте.
А>
А>struct bitptr
А>{
А> void* byte;
А> unsigned short bit; // (следить чтобы от [0,7])
А>};
А>
А>Дальше вобщем не сложно. Инициализация — двумя копиями структуры, отличающимися лишь значением интересующего поля. Додуматься можно. Поменять значение бита в байте, зная порядок — тривиальная задача... Только вот вопрос — кому этот весь изврат нужен ? Наверняка можно что-то где-то поменять и сразу буит щастье.
Ну дабы было счастье в общем виде — ещё нужен, как минимум, размер поля ( кол-во бит, которые оно занимает )
On Thu, 01 Dec 2005 09:48:08 -0000, srggal <21794@users.rsdn.ru> wrote:
> А>Указатель (адрес, etc) это порядковый номер байта где-то (стек, куча...). Для представления "адреса" бита нужно два числа — указатель на байт и номер бита в байте. > > А>
> А>struct bitptr
> А>{
> А> void* byte;
> А> unsigned short bit; // (следить чтобы от [0,7])
> А>};
> А>
> > А>Дальше вобщем не сложно. Инициализация — двумя копиями структуры, отличающимися лишь значением интересующего поля. Додуматься можно. Поменять значение бита в байте, зная порядок — тривиальная задача... Только вот вопрос — кому этот весь изврат нужен ? Наверняка можно что-то где-то поменять и сразу буит щастье. > > Ну дабы было счастье в общем виде — ещё нужен, как минимум, размер поля ( кол-во бит, которые оно занимает )
Это не поможет. Проблема в том, что layout битовых полей implementation defined, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.
Здравствуйте, MaximE, Вы писали:
>> Ну дабы было счастье в общем виде — ещё нужен, как минимум, размер поля ( кол-во бит, которые оно занимает )
ME>Это не поможет. Проблема в том, что layout битовых полей implementation defined, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.
Я и не утверждал, что поможет
поможет только лобовой удар в виде прокси на каждое поле
Здравствуйте, MaximE, Вы писали:
ME>Это не поможет. Проблема в том, что layout битовых полей implementation defined, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.
layout — это еще не самое страшное, пусть будет корректно только для данной implementation, а вот если поле размещается в нескольких байтах, то все это построение сразу падает. Придется хранить в этом "указателе" еще и длину в битах.
Это не то, что нужно, но в некоторых случаях может помочь.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth