Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Битовые поля


Автор: Neox_GeForce 28.3.2010, 15:47
Подскажите , какая максимальная длина битового поля? А то я  пишу
Код

struct BitFields {
unsigned long check : 32;
};

пишет ошибку что битовое поле завелико.

Автор: W4FhLF 28.3.2010, 15:53
А ты сам посмотри:

Код

printf("%l", sizeof(unsigned long) * 8 - 1);

Автор: azesmcar 28.3.2010, 15:56
Цитата

The constant expression shall be an integral constantexpression with a value greater than or equal to zero. The constant expression may be larger than the number of bits in the object representation (3.9) of the bitfield’s type; in such cases the extra bits are used as padding bits and do not participate in the value representation (3.9) of the bitfield.
Allocation of bitfields within a class object is implementationdefined.

Какой компилятор и платформа?
У меня на gcc и Visual Studio 2008 никаких ошибок. Обычно unsigned long это 4 байта.

Интересно, что Visual Studio выдал ошибку на коде
Код

struct BitFields {
    unsigned long check :50;
};

gcc выдает только warning.

Добавлено @ 16:00
Цитата(W4FhLF @  28.3.2010,  15:53 Найти цитируемый пост)
А ты сам посмотри:

а почему -1?

Автор: Neox_GeForce 28.3.2010, 16:22
Цитата(W4FhLF @  28.3.2010,  15:53 Найти цитируемый пост)
printf("%l", sizeof(unsigned long) * 8 - 1);

31 тоесть 32 бита  влазит в unsigned long

Цитата(azesmcar @  28.3.2010,  15:56 Найти цитируемый пост)
Какой компилятор и платформа?

Borland C++, Windows

Автор: azesmcar 28.3.2010, 16:23
Цитата(Neox_GeForce @  28.3.2010,  16:22 Найти цитируемый пост)
Borland C++

Консольная версия?

Автор: Neox_GeForce 28.3.2010, 16:24
да

Автор: azesmcar 28.3.2010, 16:24
Цитата(Neox_GeForce @  28.3.2010,  16:22 Найти цитируемый пост)
31 тоесть 32 бита  влазит в unsigned long

хотя если выводит 31 то ошибка компилятора, советую перейти на что нибудь нормальное, от борланда можно ожидать чего угодно.

Автор: Neox_GeForce 28.3.2010, 16:26
Цитата(azesmcar @  28.3.2010,  16:24 Найти цитируемый пост)
хотя если выводит 31 то ошибка компилятора, советую перейти на что нибудь нормальное, от борланда можно ожидать чего угодно. 

я писал так 
Код

sizeof(unsigned long) * 8 - 1

если 
так
Код

sizeof(unsigned long) * 8
 то 32

Автор: azesmcar 28.3.2010, 16:27
Цитата(Neox_GeForce @  28.3.2010,  16:26 Найти цитируемый пост)
я писал так 

ну это понятно smile 
Твой компилятор давно устарел, смени на что нибудь поновее, gcc, Visual Studio...

Автор: Neox_GeForce 28.3.2010, 16:28
И ошибке 2 в одной строчке
Код

1. Bit field too large
2. Bit fields must have integral type

странно я ведь пишу unsigned без знаковое.

Добавлено через 3 минуты и 18 секунд
щас перекомпилирую и отпишу.

Автор: SABROG 28.3.2010, 16:48
Вопрос в догонку. Нормально ли компилятор работает с битовыми полями на разных архитектурах с другим порядком байт, endianess? Если я правильно понимаю, то проблема может возникнуть только если данные были получены из внешнего источника, файл на диске, пакет по сети?

Автор: mes 28.3.2010, 17:14
Цитата(SABROG @  28.3.2010,  15:48 Найти цитируемый пост)
. Нормально ли компилятор работает с битовыми полями на разных архитектурах с другим порядком байт, endianess?

работает то нормально, но порядок байт "не учитывает".
smile

Автор: Neox_GeForce 28.3.2010, 17:14
ошибки компиляции какие-то
Код

#include<stdio.h>
#include<conio.h>
#include <math.h>
struct Bits
{
unsigned long check           :32;

    };

int main ()
{
int a=0;
int i=0,k=0;
clrscr();
printf("Vvedit 4usJIo \n");
printf("%i",sizeof(unsigned long)*8);
scanf("%d",&a);
Bits BW;


BW.check=1;
if(a<pow(2,8)) k=8; else
if(a<pow(2,16)) k=16; else
if(a<pow(2,32)) k=32;
printf("%d-bit number \n",k);
while(i<k) {
if(BW.check&a)
{
printf("\"1\" y pos %d\n",i+1);
}  else
{
printf("\"0\" y pos %d \n",i+1);
}
BW.check<<=1;
i++;
}

char c=getche();
return 0;
}


Код

C:\MinGW\bin>gcc -c noname00.c
noname00.c: In function `main':
noname00.c:19: error: `Bits' undeclared (first use in this function)
noname00.c:19: error: (Each undeclared identifier is reported only once
noname00.c:19: error: for each function it appears in.)
noname00.c:19: error: syntax error before "BW"
noname00.c:20: error: `BW' undeclared (first use in this function)
noname00.c:39:2: warning: no newline at end of file


Автор: azesmcar 28.3.2010, 17:21
Цитата(SABROG @  28.3.2010,  16:48 Найти цитируемый пост)
Вопрос в догонку. Нормально ли компилятор работает с битовыми полями на разных архитектурах с другим порядком байт, endianess? Если я правильно понимаю, то проблема может возникнуть только если данные были получены из внешнего источника, файл на диске, пакет по сети? 

цитирую продолжение
Цитата

Allocation of bit-fields within a class object is implementationdefined. Alignment of bit-fields is implementation defined.


Добавлено через 1 минуту и 42 секунды
Цитата(Neox_GeForce @  28.3.2010,  17:14 Найти цитируемый пост)
ошибки компиляции какие-то

о чем речь? какой компилятор? все тот же? Тогда что изменились? Если сменил на нормальный, то в нормальном компиляторе нет функций clrscr()
и даже заголовочных файлов
Цитата

#include<stdio.h>
#include<conio.h>
#include <math.h>

может не быть, правильно будет
Код

#include<cstdio>
#include <cmath>

а conio.h в библиотеке C++ не существует.

Автор: Neox_GeForce 28.3.2010, 17:29
мне на С надо.

Автор: mes 28.3.2010, 18:07
Цитата(Neox_GeForce @  28.3.2010,  16:29 Найти цитируемый пост)
мне на С надо. 

Цитата(Neox_GeForce @  28.3.2010,  16:14 Найти цитируемый пост)
noname00.c:19: error: `Bits' undeclared (first use in this function)

Цитата(Neox_GeForce @  28.3.2010,  16:14 Найти цитируемый пост)
Bits BW;

в С нужно явно указывать что тип являются структурой, т.е
Код

struct Bits BW;


Автор: SABROG 28.3.2010, 18:53
Цитата(mes @  28.3.2010,  17:14 Найти цитируемый пост)
работает то нормально, но порядок байт "не учитывает".


Цитата(azesmcar @  28.3.2010,  17:21 Найти цитируемый пост)
Allocation of bit-fields within a class object is implementationdefined. Alignment of bit-fields is implementation defined.


То есть при соблюдении следующих условий проблем никогда не возникнет? :

- объект создается динамически программой и используется только внутри этой программы
- объект существует пока программа работает
- объект не должен передаваться между разными модулями программы (.dll, .exe и т.п.), если модули могли быть написаны на разных языках  программирования или собраны разными компиляторами, а также сохраняться на диск или передаваться во внешний источник
- программа должна быть пересобрана заново на новой архитектуре, перенос исполнимого файла между компьютерами не допускается

Автор: mes 28.3.2010, 20:19
SABROG, не слишком ли много условностей ? к тому же по большей мере не относящейся к так называемой проблеме, о которой ведете речь..


Цитата(SABROG @  28.3.2010,  17:53 Найти цитируемый пост)
объект создается динамически программой и используется только внутри этой программы

это вообше каким боком тут ?

Цитата(SABROG @  28.3.2010,  17:53 Найти цитируемый пост)
- объект существует пока программа работает

а это ?

Цитата(SABROG @  28.3.2010,  17:53 Найти цитируемый пост)
объект не должен передаваться между разными модулями программы (.dll, .exe и т.п.), если модули могли быть написаны на разных языках  программирования или собраны разными компиляторами,

слишком далеко копнули, "проблема" выше ..   получить проблему можно легко, не имея ни модулей, ни других языков, просто приведя многобайтовое значение к битовой структуре.

Цитата(SABROG @  28.3.2010,  17:53 Найти цитируемый пост)
а также сохраняться на диск 

Если предназначен для чтения той же самой программой, то никаких проблем..

Цитата(SABROG @  28.3.2010,  17:53 Найти цитируемый пост)
- программа должна быть пересобрана заново на новой архитектуре, перенос исполнимого файла между компьютерами не допускается 

Ну а битовые поля тут при чем ?

Автор: SABROG 28.3.2010, 22:41
Цитата(mes @  28.3.2010,  20:19 Найти цитируемый пост)
получить проблему можно легко, не имея ни модулей, ни других языков, просто приведя многобайтовое значение к битовой структуре.


В той же программе? То есть я создал объект, затем сделал memcpy как для unsigned char* по другому адресу и получил косяк при обратном преобразовании?

Автор: mes 29.3.2010, 09:05
Цитата(SABROG @  28.3.2010,  21:41 Найти цитируемый пост)
как для unsigned char*

Цитата(mes @  28.3.2010,  19:19 Найти цитируемый пост)
многобайтовое значение

имелись ввиду "длинные" значения,  такие как short, int.. с зависимым порядком байт 

Цитата(SABROG @  28.3.2010,  21:41 Найти цитируемый пост)
по другому адресу и получил косяк 

адрес не причем, ну и само битовое представление тоже косвенно..
важен привод к другому типу, например
А а = *(А*) &i;  // i - int, sizeof(a) == sizeof (i);
то результат неопределен (будет зависеть от платформы)
хотя на приведенную конструкцию компилятор должен закричать, но от memcpy уже не спасет.


Цитата(SABROG @  28.3.2010,  21:41 Найти цитируемый пост)
при обратном преобразовании? 

при обратном преобразовании, если были учтены размеры и не было потери данных, будет все в порядке.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)