Адрес битового поля
От: orbital Россия  
Дата: 30.11.05 18:18
Оценка:
Уважаемые знатоки, к вам вопрос.

Есть структура вида

struct X_BITS
{
  Uint16 f1:2;
  Uint16 f2:3;
  Uint16 f3:4;
}


возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..
Re: Адрес битового поля
От: achp  
Дата: 30.11.05 18:27
Оценка: +1
Здравствуйте, orbital, Вы писали:

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


Нет.
Re[2]: Адрес битового поля
От: Аноним  
Дата: 30.11.05 18:32
Оценка:
O>>возможно ли получить адрес, допустим f2, и потом по этому адресу записать значение и так чтобы не затерло другие поля..

A>Нет.


А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?
Re[3]: Адрес битового поля
От: achp  
Дата: 30.11.05 18:40
Оценка: 1 (1) -1
Здравствуйте, Аноним, Вы писали:

А>А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?


Тоже никак.
Re[3]: Адрес битового поля
От: Radmir Россия  
Дата: 01.12.05 05:39
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

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


A>>Нет.


А>А как, интересно, брать адреса отдельных элементов вектора vector<bool>, ведь там организовано побитовое хранение эементов?


адрес элементе vector<bool> взять можно НО функция vector<bool>::возвращаетобъект , который только имитирует ссылку на отдельный бит.
В связи с этим vector<bool> не является полноценным контейнером в STL и спецификация для него особо оговорена в Стандерте.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re: Адрес битового поля
От: Radmir Россия  
Дата: 01.12.05 05:39
Оценка:
Здравствуйте, orbital, Вы писали:

O>Уважаемые знатоки, к вам вопрос.


O>Есть структура вида


O>
O>struct X_BITS
O>{
O>  Uint16 f1:2;
O>  Uint16 f2:3;
O>  Uint16 f3:4;
O>}
O>


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


Получить указатели и ссылки на битоыве поля нельзя.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[4]: Адрес битового поля
От: Bell Россия  
Дата: 01.12.05 07:38
Оценка: 1 (1) +1
Здравствуйте, Radmir, Вы писали:

R>адрес элементе vector<bool> взять можно

Нет, нельзя:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
   vector<bool> bv;
   bv.push_back(true);

   cout << &bv[0] << '\n';
   return 0;
}


"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 и спецификация для него особо оговорена в Стандерте.
А вот тут все верно
Любите книгу — источник знаний (с) М.Горький
Re[5]: Адрес битового поля
От: Radmir Россия  
Дата: 01.12.05 08:01
Оценка:
Здравствуйте, 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])
};


Дальше вобщем не сложно. Инициализация — двумя копиями структуры, отличающимися лишь значением интересующего поля. Додуматься можно. Поменять значение бита в байте, зная порядок — тривиальная задача... Только вот вопрос — кому этот весь изврат нужен ? Наверняка можно что-то где-то поменять и сразу буит щастье.
Re[2]: Адрес битового поля
От: srggal Украина  
Дата: 01.12.05 09:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, orbital, Вы писали:


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


А>Указатель (адрес, etc) это порядковый номер байта где-то (стек, куча...). Для представления "адреса" бита нужно два числа — указатель на байт и номер бита в байте.


А>
А>struct bitptr
А>{
А>  void* byte;
А>  unsigned short bit;  // (следить чтобы от [0,7])
А>};
А>


А>Дальше вобщем не сложно. Инициализация — двумя копиями структуры, отличающимися лишь значением интересующего поля. Додуматься можно. Поменять значение бита в байте, зная порядок — тривиальная задача... Только вот вопрос — кому этот весь изврат нужен ? Наверняка можно что-то где-то поменять и сразу буит щастье.


Ну дабы было счастье в общем виде — ещё нужен, как минимум, размер поля ( кол-во бит, которые оно занимает )
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Адрес битового поля
От: MaximE Великобритания  
Дата: 01.12.05 10:26
Оценка: +1
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, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[4]: Адрес битового поля
От: srggal Украина  
Дата: 01.12.05 10:33
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Ну дабы было счастье в общем виде — ещё нужен, как минимум, размер поля ( кол-во бит, которые оно занимает )


ME>Это не поможет. Проблема в том, что layout битовых полей implementation defined, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.


Я и не утверждал, что поможет

поможет только лобовой удар в виде прокси на каждое поле
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Адрес битового поля
От: Pavel Dvorkin Россия  
Дата: 01.12.05 10:38
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Это не поможет. Проблема в том, что layout битовых полей implementation defined, поэтому даже имея номер первого бита и длину поля ты все равно не сможешь построить маску.


layout — это еще не самое страшное, пусть будет корректно только для данной implementation, а вот если поле размещается в нескольких байтах, то все это построение сразу падает. Придется хранить в этом "указателе" еще и длину в битах.
With best regards
Pavel Dvorkin
Re: Адрес битового поля
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 01.12.05 13:04
Оценка: :)))
Здравствуйте, orbital, Вы писали:

От меня адрес брать нельзя!!!!
ОФФТОП
От: srggal Украина  
Дата: 01.12.05 13:10
Оценка: :))
Здравствуйте, BitField, Вы писали:

BF>От меня адрес брать нельзя!!!!


Запросто, здесь E-mail
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Адрес битового поля
От: gear nuke  
Дата: 01.12.05 17:11
Оценка:
Здравствуйте, orbital, Вы писали:

O>Уважаемые знатоки, к вам вопрос.


O>Есть структура вида


O>
O>struct X_BITS
O>{
O>  Uint16 f1:2;
O>  Uint16 f2:3;
O>  Uint16 f3:4;
O>}

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

В MSVC есть такое Microsoft Specific:
_bittest
_bittestandcomplement
_bittestandreset
_bittestandset
и до кучи
_BitScanForward
_BitScanReverse

Это не то, что нужно, но в некоторых случаях может помочь.
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.