Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовые поля, Максимальна длина 
:(
    Опции темы
Neox_GeForce
Дата 28.3.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



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

struct BitFields {
unsigned long check : 32;
};

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


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
W4FhLF
Дата 28.3.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



А ты сам посмотри:

Код

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



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
azesmcar
Дата 28.3.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

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?

Это сообщение отредактировал(а) azesmcar - 28.3.2010, 16:04
PM   Вверх
Neox_GeForce
Дата 28.3.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



Цитата(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


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 28.3.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

Консольная версия?
PM   Вверх
Neox_GeForce
Дата 28.3.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



да


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 28.3.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

хотя если выводит 31 то ошибка компилятора, советую перейти на что нибудь нормальное, от борланда можно ожидать чего угодно.
PM   Вверх
Neox_GeForce
Дата 28.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



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

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

sizeof(unsigned long) * 8 - 1

если 
так
Код

sizeof(unsigned long) * 8
 то 32


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 28.3.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

ну это понятно smile 
Твой компилятор давно устарел, смени на что нибудь поновее, gcc, Visual Studio...
PM   Вверх
Neox_GeForce
Дата 28.3.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



И ошибке 2 в одной строчке
Код

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

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

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


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
SABROG
Дата 28.3.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 28.3.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
Neox_GeForce
Дата 28.3.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



ошибки компиляции какие-то
Код

#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



Это сообщение отредактировал(а) Neox_GeForce - 28.3.2010, 17:23


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 28.3.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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++ не существует.
PM   Вверх
Neox_GeForce
Дата 28.3.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



мне на С надо.


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
mes
Дата 28.3.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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;




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 28.3.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(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 и т.п.), если модули могли быть написаны на разных языках  программирования или собраны разными компиляторами, а также сохраняться на диск или передаваться во внешний источник
- программа должна быть пересобрана заново на новой архитектуре, перенос исполнимого файла между компьютерами не допускается


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 28.3.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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 Найти цитируемый пост)
- программа должна быть пересобрана заново на новой архитектуре, перенос исполнимого файла между компьютерами не допускается 

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

Это сообщение отредактировал(а) mes - 28.3.2010, 20:19


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 28.3.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



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


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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 29.3.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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 Найти цитируемый пост)
при обратном преобразовании? 

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





--------------------
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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