Выравнивание полей структур
От: Bujum  
Дата: 11.11.03 06:23
Оценка:
Здравствуй All.

имеется структура следующего вида:

struct Foo
  {
  BYTE  a;
  DWORD b;
  };


Ессно sizeof(Foo) возвращает не 5. (У меня 8).
В настройках VC7: Struct member alingment — default. (1 byte не предлагать)

Исходя из всего вышеперечисленного:
Foo foo;
ReadFile(hFile, &foo, sizeof(Foo), ...)


не катит, потому-что читает 8 байт а не 5. (файл писала прога под другой
операционной системой, там с этой байдой все в порядке).

Можно как нибудь прочитать файл в структуру не прибегая чтению
каждого поля в отдельности? (Настоящая структура сложнее чем приведеная выше).
... << RSDN@Home 1.1 beta 2 >>
Re: Выравнивание полей структур
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.11.03 06:39
Оценка:
Здравствуйте, Bujum, Вы писали:

B>имеется структура следующего вида:


B>
B>struct Foo
B>  {
B>  BYTE  a;
B>  DWORD b;
B>  };
B>


B>Ессно sizeof(Foo) возвращает не 5. (У меня 8).

B>В настройках VC7: Struct member alingment — default. (1 byte не предлагать)

ну поставь не в настройках, а только для этой структуры:

#pragma pack (push, 1)
struct Foo
{
  BYTE  a;
  DWORD b;
};
#pragma pack (pop)


если она пишется с выравниванием в 1 байт, другого выхода у тебя все равно нет
Re: Выравнивание полей структур
От: Аноним  
Дата: 11.11.03 06:47
Оценка:
Здравствуйте, Bujum, Вы писали:


B>Ессно sizeof(Foo) возвращает не 5. (У меня 8).

B>В настройках VC7: Struct member alingment — default. (1 byte не предлагать)

B>Можно как нибудь прочитать файл в структуру не прибегая чтению

B>каждого поля в отдельности? (Настоящая структура сложнее чем приведеная выше).

выравнивай по 1 байту только структуру #pragma pack(1) и будет тебе щастье
Re[2]: Выравнивание полей структур
От: Bujum  
Дата: 11.11.03 06:54
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


B>>имеется структура следующего вида:


B>>
B>>struct Foo
B>>  {
B>>  BYTE  a;
B>>  DWORD b;
B>>  };
B>>


B>>Ессно sizeof(Foo) возвращает не 5. (У меня 8).

B>>В настройках VC7: Struct member alingment — default. (1 byte не предлагать)

OE>ну поставь не в настройках, а только для этой структуры:


OE>
OE>#pragma pack (push, 1)
OE>struct Foo
OE>{
OE>  BYTE  a;
OE>  DWORD b;
OE>};
OE>#pragma pack (pop)
OE>


OE>если она пишется с выравниванием в 1 байт, другого выхода у тебя все равно нет



а если будет так:

struct Foo
{
  BYTE a;
  DWORD b;
};

struct DerFoo
: public Foo
{
  WORD c;
};


насколько я понимаю теперь читать напрямую в структуру не только сложно, но и опасно. Ведь первые байты
в ней указатель на Foo. Как быть в это случае?
Re[3]: Выравнивание полей структур
От: Андрей Тарасевич Беларусь  
Дата: 11.11.03 07:05
Оценка:
Здравствуйте, Bujum, Вы писали:

B>а если будет так:


B>
B>struct Foo
B>{
B>  BYTE a;
B>  DWORD b;
B>};

B>struct DerFoo
B>: public Foo
B>{
B>  WORD c;
B>};
B>


B>насколько я понимаю теперь читать напрямую в структуру не только сложно, но и опасно. Ведь первые байты

B>в ней указатель на Foo. Как быть в это случае?

Нет там никакого указателя на 'Foo'. Откуда ты это взял? Но тем не менее читать такие вещи из файла напрямую все-таки не рекомендуется.
Best regards,
Андрей Тарасевич
Re: Выравнивание полей структур
От: Аноним  
Дата: 11.11.03 07:19
Оценка:
Здравствуйте, Bujum, Вы писали:


B>не катит, потому-что читает 8 байт а не 5. (файл писала прога под другой

B>операционной системой
, там с этой байдой все в порядке).

B>Можно как нибудь прочитать файл в структуру не прибегая чтению

B>каждого поля в отдельности? (Настоящая структура сложнее чем приведеная выше).

Если не просто под другой OS, но и под другой платформой,
да еще и с отличным от твоего порядком байт с слове,
то скорее всего эта прога таки писала с конвертацией в network byte order.
И тебе таки прийдётся читать по полям.

Если же у вас какой-то кроссплатформенный формат и целые там записаны
не в network byte order'е, то вы ищете себе приключений на филейные части тела
Re[4]: Выравнивание полей структур
От: Bujum  
Дата: 11.11.03 07:24
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


B>>а если будет так:


B>>
B>>struct Foo
B>>{
B>>  BYTE a;
B>>  DWORD b;
B>>};

B>>struct DerFoo
B>>: public Foo
B>>{
B>>  WORD c;
B>>};
B>>


B>>насколько я понимаю теперь читать напрямую в структуру не только сложно, но и опасно. Ведь первые байты

B>>в ней указатель на Foo. Как быть в это случае?

АТ>Нет там никакого указателя на 'Foo'. Откуда ты это взял? Но тем не менее читать такие вещи из файла напрямую все-таки не рекомендуется.

^^^^^^
Вы конечно правы. Это я ошибся, просто прототип класса Foo на самом деле содержит виртуальные функции
Так как все таки быть в этом случае?
Re[2]: Выравнивание полей структур
От: Bujum  
Дата: 11.11.03 07:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если не просто под другой OS, но и под другой платформой,

^^^
точно, именно это и хотел сказать

А>да еще и с отличным от твоего порядком байт с слове,

А>то скорее всего эта прога таки писала с конвертацией в network byte order.
^^^^
опять точно — порядок big endian

А>И тебе таки прийдётся читать по полям.

^^^^
вот тут Вы не правы, порядок наверху разбирается. В структуре на самом деле не
стандартные типы, а классы, ведущие себя аналогичто стандартным, но хранящие в себе байты
в network order.

А>Если же у вас какой-то кроссплатформенный формат и целые там записаны

А>не в network byte order'е, то вы ищете себе приключений на филейные части тела
^^^
Re[3]: Выравнивание полей структур
От: e-Xecutor Россия  
Дата: 11.11.03 07:55
Оценка:
Здравствуйте, Bujum, Вы писали:


А>>И тебе таки прийдётся читать по полям.

B>^^^^
B>вот тут Вы не правы, порядок наверху разбирается. В структуре на самом деле не
B>стандартные типы, а классы, ведущие себя аналогичто стандартным, но хранящие в себе байты
B>в network order.
Хм. Смотрим на оригинальный пост.
Там ты спрашиваешь, как быть с выравниванием полей в структуре,
дабы её можно было целиком зачитать из файла, а не по полям
Потом всплывает какая-то виртуальность...
Это уже противоречит записи структуры целиком.
Но в любом случае, даже если ты будешь целиком их зачитывать,
поля то надо конвертить.
ИМХО таки проще сделать так:
readnetworked(f,s.field1);
readnetworked(f,s.field2);

чем так:

fread(&s,sizeof(s),1,f);
s.field1=ntohs(s.field1);
s.field2=ntohl(s.field2);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.