если она пишется с выравниванием в 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) и будет тебе щастье
B>>Ессно sizeof(Foo) возвращает не 5. (У меня 8). B>>В настройках VC7: Struct member alingment — default. (1 byte не предлагать)
OE>ну поставь не в настройках, а только для этой структуры:
OE>
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'е, то вы ищете себе приключений на филейные части тела
B>>насколько я понимаю теперь читать напрямую в структуру не только сложно, но и опасно. Ведь первые байты B>>в ней указатель на Foo. Как быть в это случае?
АТ>Нет там никакого указателя на 'Foo'. Откуда ты это взял? Но тем не менее читать такие вещи из файла напрямую все-таки не рекомендуется.
^^^^^^
Вы конечно правы. Это я ошибся, просто прототип класса Foo на самом деле содержит виртуальные функции
Так как все таки быть в этом случае?
Здравствуйте, Аноним, Вы писали:
А>Если не просто под другой OS, но и под другой платформой,
^^^
точно, именно это и хотел сказать
А>да еще и с отличным от твоего порядком байт с слове, А>то скорее всего эта прога таки писала с конвертацией в network byte order.
^^^^
опять точно — порядок big endian
А>И тебе таки прийдётся читать по полям.
^^^^
вот тут Вы не правы, порядок наверху разбирается. В структуре на самом деле не
стандартные типы, а классы, ведущие себя аналогичто стандартным, но хранящие в себе байты
в network order.
А>Если же у вас какой-то кроссплатформенный формат и целые там записаны А>не в network byte order'е, то вы ищете себе приключений на филейные части тела
^^^
А>>И тебе таки прийдётся читать по полям. B>^^^^ B>вот тут Вы не правы, порядок наверху разбирается. В структуре на самом деле не B>стандартные типы, а классы, ведущие себя аналогичто стандартным, но хранящие в себе байты B>в network order.
Хм. Смотрим на оригинальный пост.
Там ты спрашиваешь, как быть с выравниванием полей в структуре,
дабы её можно было целиком зачитать из файла, а не по полям
Потом всплывает какая-то виртуальность...
Это уже противоречит записи структуры целиком.
Но в любом случае, даже если ты будешь целиком их зачитывать,
поля то надо конвертить.
ИМХО таки проще сделать так:
readnetworked(f,s.field1);
readnetworked(f,s.field2);