побитовые поля

  • Автор темы AlexSaaa
  • Дата начала
A

AlexSaaa

#1
почитал теорию..вроде бы легко
пытаюсь создать что-то простое для лучшего усвоения..и возникают ошибки..

что делал:
пытаюсь написать битовое поле для хранения времени(часы, минуты, секунды)
создал структуру Время(пока не задаю длины) --> компилирует нормально..
после того как задал длину поля..выдается ошибка в строке где пытаюсь ввести значение с клаиатуры
error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
struct Time{
int Hours:4;
int Minutes;
int Seconds;
int Milisec;
}time;
void Input_time(Time &s){
do{
cout<<"Hours: ";
cin>>s.Hours;----ошибка
 
D

DAle

#2
Ну хоть нашелся вопрос более-менее :blink:. Тут дело вот в чем.
Для начала попробуем скомпилировать похожий код "нормальным" компилятором, а именно comeau. Получаем:
error: taking the address of a bit field is not allowed
cin >> s.Hours;
Далее цитата из стандарта:
9.6/3
The address-of operator & shall not be applied to a bit-field, so there are no pointers to bit-fields. A non-const reference shall not be bound to a bit-field (8.5.3).
Дело в том, что operator<< требует неконстантную ссылку на int, а по приведенной выше цитате нельзя получить неконстантную ссылку на битовое поле.

Заведи временную переменную типа int, прочитай, и присвой битовому полю.
 
A

AlexSaaa

#3
не совсем понял.. можна подробнее про инт переменную
 
D

DAle

#4
<!--QuoteBegin-AlexSaaa+21:09:2005, 15:14 -->
<span class="vbquote">(AlexSaaa @ 21:09:2005, 15:14 )</span><!--QuoteEBegin-->не совсем понял.. можна подробнее про инт переменную
[snapback]25039" rel="nofollow" target="_blank[/snapback]​
[/quote]

Что ж тут непонятного.
Код:
  int hours;
 cin >> hours;
 s.Hours = hours;
 
A

AlexSaaa

#5
вот еще одна проблемка..как мне кажется из того же розряда..
создано обьединение (unit) с int елементов
нужно произвести некоторые арифметические действия с елементами обединения .. компилятор такие действия не допускоет ..вариант с временной инт еременной не проходит так как невозможно преобразовать елемент обьединения в инт елемент
 
D

DAle

#6
Объединение - это вообще-то union. Если честно, ничего не понял толком, приведи код.
 
A

AlexSaaa

#7
union color{
int Red;
int Blue;
int Green;
};

void Transfer(color &A){
char TransfTab[16]={'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F'};

RGB[size]=TransfTab[A/16];
RGB[size+1]=TransfTab[А%16];
size+=2;

}
int main(){
color ID;
do{
cout<<"Red: ";
cin>>ID.Red;
}while(ID.Red>255||ID.Red<0);
Transfer(ID);
пытаюсь перевести число из десятично в 16-ую систему счисления
 
G

Guest

#8
Чтобы обратиться к членам union надо указать их имя, то есть в твоем случае это, например, A.Red

А вообще какой-то совсем неправильный подход, во-первых непонятно зачем тут union, во-вторых зачем-то функция, преобразующая десятичное число в 16ичное представление, имеет параметр типа color&. Да и вообще есть itoa.
 
A

AlexSaaa

#9
это тиба пример из учебника..и насколько я понял..суть в том что-бы использовать обьединение