Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовая структура в С++. Подскажите, кто из нас не прав! 
V
    Опции темы
JoeBlack
Дата 30.10.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток!
Прочитал в книге, что в битовой структуре складываются все биты. Получаю общий размер. Если хотя бы бит не влазит в число, кратное 8, то соответственно, для него выделяется еще байт.
Написан код:
Код

#include <stdio.h>
#include <string.h>

struct Client
{
unsigned a1  :10;
unsigned a2  :10;
unsigned a3  :10;
unsigned a4  :10;
unsigned a5  :10;
unsigned a6  :10;
unsigned a7  :10;
unsigned a8  :10;
unsigned a9  :10;
unsigned a10 :10;
unsigned a11 :1;
unsigned a12 :1;
unsigned a13 :1;
unsigned a14 :1;
unsigned a15 :1;
unsigned a16 :1;
unsigned a17 :1;
unsigned a18 :1;
unsigned a19 :1;
unsigned a20 :1;
unsigned a21 :1;
unsigned a22 :1;
unsigned a23 :1;
unsigned a24 :7;
};

int main(void)
{
FILE *stream;
Client AClient;
//open file
if ((stream = fopen("c:\\a1.dat","wb")) == NULL)
   {
    printf("can't open file\n");
    return 1;
   }

AClient.a1=0x1;
AClient.a2=0x0;
AClient.a3=0x0;
AClient.a4=0x0;
AClient.a5=0x0;
AClient.a6=0x0;
AClient.a7=0x0;
AClient.a8=0x0;
AClient.a9=0x0;
AClient.a10=0x0;
AClient.a11=0x0;
AClient.a12=0x0;
AClient.a13=0x0;
AClient.a14=0x00;
AClient.a15=0x0;
AClient.a16=0x0;
AClient.a17=0x00;
AClient.a18=0x0;
AClient.a19=0x0;
AClient.a20=0x00;
AClient.a21=0x0;
AClient.a22=0x0;
AClient.a23=0x00;
AClient.a24=0x0;
;
//save to file
fwrite(&AClient, sizeof(AClient),1,stream);
//fwrite(&AClient, sizeof(AClient),1,stream);
// close file
fclose(stream);
return 0;
}

Итого, я получаю 120 бит. Хочу видеть размер файла в 15 байт...НО..он создается в 16. По ходу, вписывает в него, где-то в средине, лишнюю информацию. А я ведь должен увидеть только значение 1.
Отчего это так выходит? Если делаю 2 раза вывод, то получаю 32 байта...
Спасибо!!!
P.S. Чем можно смотреть *.dat? я смотрю WinHex, но он показывает по-байтно..А мне бы в битах....
P.P.S. Компиляруется в Builder C++ 6.0. В Visual C++ 6.0 та же картина. Borland C++ 5.02 вообще выдает 25 байт при одном записывании.

PM MAIL   Вверх
JoeBlack
Дата 30.10.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в 67 строке нет ";"!!

Добавлено @ 10:48 
может быть потому, что fwrite дописывает еще 0 в конце? не помню сейчас, точно ли там 0 стоит..
PM MAIL   Вверх
pandrew
Дата 30.10.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(JoeBlack)
Если хотя бы бит не влазит в число, кратное 8,

Выравнивание зависит от настроек компилятора, либо от #pragma.
Дабы не заниматься подсчетом длины битовых структур, проще воспользоваться битовыми масками, да и работают они быстрее.
PM MAIL   Вверх
JoeBlack
Дата 30.10.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



понял..постараюсь посмотреть в настройках компилятора..где-то там это должно быть..
Спасибо!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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