Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

Использование #pragma pack(push,1)... pack(pop)

27.11.2009, 11:58. Показов 90512. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, товарищи.

Задался вопросом о записи в файл структур данных, читал читал в интернете много интересного. Наткнулся на статью, где описан такой вот вариант задания структур:

C++
1
2
3
#pragma pack (push, 1)
deftype struct {...}
#pragma pack ( pop)
Но почему-то автор не рекомендует использовать, вот я не совсем понял этот момент. Он описал как-то расплывчато пример, когда это не сработает...

Я использую структуру с уже определёнными размерами параметров, так что её размер не будет меняться во времени, проверил, у меня всё работает.

Но почему же автор всё-таки не рекомендует это использовать???
Может есть ещё интересные варианты?

Для записи в файл использую CreateFile, WriteFile (MSDN->System services->File services->file systems->file management)...

Заранее благодарю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2009, 11:58
Ответы с готовыми решениями:

[variadic pack][cdecl]
доброе утро. рассмотрим код: http://rextester.com/ATJJT68666 #include <iostream>

IAR EWARM, непонятное поведение data pragma pack
EWARM 6.50.6, понадобилось упаковать класс, чтобы красиво и грамотно гонять его туда-сюда по коммуникациям. По примеру сделал так: ...

Русские символы NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251
Помогите пожалуйста!!!!!! имею NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251 Выполняю код с подключением к базе через ODBC...

51
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.04.2011, 20:40
Студворк — интернет-сервис помощи студентам
Почему прикладная программа не работает с железом работает ещё как но использует удобные функции системы а не ввиде 0FEF00E7h абстракцию создаёт понятную нам, парадигма систем облегчение программироавние железа, а не купание в байт кодах. Так же можно сказать про нас что мы с миром не контачим непосредственно а купаемся в абстракциях мозга ЦНС электро-импульсов то что не надо здесь разводить суть вещей...
0
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
11.04.2011, 20:56
Цитата Сообщение от Evg Посмотреть сообщение
Вообще говоря, любой адрес выровнен на 1 байт. А твои слова сильно смахивают на испорченный телефон. Не говоря уж о том, что напрямую с железками работает только ОС, а не пользовательская программа
бла бла бла, какой ты опять умный, опять очередной твой такой же пост

про то, что человек, занимающийся драйверами использует эти приемы в прикладных программах у меня не было и слова - заметь

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

что не пост от Evg, то всегда попытка съязвить

и когда я писал предыдущее собщение, то по-любому был уверен, что найдется хотя бы 1 человек, который несмотря на то, что топику уже 2 года, все равно возьмет и ответит - и о да, конечно же я был уверен на 100 %, что это будет Evg - ведь он обязательно найдет за что зацепится и обязательно покажет свою крутость
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.04.2011, 21:58
__beginner__, если отбросить флуд и эмоции, то что ты этим хотел сказать? И заодно поясни, что имелось в виду под "прям обязательно нужно выравнивать по 1 байту", если уж тебе так хочется почесать языком
1
 Аватар для snake32
3511 / 1694 / 236
Регистрация: 26.02.2009
Сообщений: 8,493
Записей в блоге: 6
05.12.2011, 17:04
Цитата Сообщение от Paulie Посмотреть сообщение
если взять проекцию на Делфи, то диреткива #pragma pack делает что-то наподобие, как и record packed в Делфи? Или второе - это выравнивание структуры, а в сях - выравнивание полей, как сказал уважаемый Evg, ну это так, чисто интерес, вспомнилось былое прошлое...
В делфях record packed выравнивает поля структуры как и #pragma pack 1
Кстати есть ещё выравнивание в массиве packed array
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
28.05.2012, 12:58
коммент не убрал...бывает..
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.05.2012, 20:22
Цитата Сообщение от Evg Посмотреть сообщение
А вопрос не в оптимизации структуры. Вопрос в том, чтобы правильно расписать структуру, чтобы она один в один ложилась на формат бинарного файла. Т.е. если в бинарном файле заголовок состоит из трёх полей размерами в один, четыре и два байта, идущих подряд друг за другом, то можно написать структуру

C
1
2
3
4
5
6
7
8
#pragma pack (push, 1)
struct
{
  char f1;
  int f2;
  short f3;
};
#pragma pack (pop)
и потом целиком экземпляр этой структуры одной операцией записывать или считывать в файл. sizoef от такой структуры будет равен 7. Стандартными средствами языка по-нормальному ты это не сделаешь. Можно только описать структуру, а потом читать-писать каждое поле в отдельности
Недавно столкнулась с такой проблемой: в Линуксе не правильно отображались данные заголовка .bmp рисунка, в виндовс я пользовалась wingdi.h и все работало, и только потом заметила, что структура заключена в данные директивы...
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 20:26
а что внутри структуры? другие структуры, внутри которых - другие и т.д.?

все работает, причем надежно, как бомба. если структуру, которую вы привели, "не заключить в данные директивы", то она будет занимать 10 байт (4+4+2), а если заключить - то 7 (1+4+2). и больше ничего за этим не скрывается. тот, кто хочет позднее обратиться к любому полю кроме f1 не по имени, а по смещению, должен точно знать, как структура была определена: "в директивах" или без.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2012, 20:32
Цитата Сообщение от novi4ok Посмотреть сообщение
а что внутри структуры? другие структуры, внутри которых - другие и т.д.
https://www.cyberforum.ru/blog... og441.html
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 20:43
если продолжать, то нужно также уточнить, что означает
в Линуксе не правильно отображались данные заголовка .bmp рисунка
хотя в ссылке вроде УРА написано, так что автор нам просто причину может назвать в деталях.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2012, 20:48
Цитата Сообщение от novi4ok Посмотреть сообщение
так что автор нам просто причину может назвать в деталях
Читатель может самостоятельно ответить на данный вопрос, если немного подумает
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 21:10
я так понял, что если писатель написал УРА, то по ссылке - работающий код?
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.05.2012, 21:11
Наглядный пример для всех кто сомневается
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
#pragma pack(push,1)
struct BITMAPFILEHEADER_PRAGMA {
    unsigned short  bfType;
    unsigned long   bfSize;
    unsigned short  bfReserved1;
    unsigned short  bfReserved2;
    unsigned long   bfOffBits;
};
#pragma pack(pop)
 
struct BITMAPFILEHEADER_NOPRAGMA{
    unsigned short  bfType;
    unsigned long   bfSize;
    unsigned short  bfReserved1;
    unsigned short  bfReserved2;
    unsigned long   bfOffBits;
};
 
 
int main()
{
    BITMAPFILEHEADER_PRAGMA    pragma;
    BITMAPFILEHEADER_NOPRAGMA  nopragma;
    FILE                        *fin;
 
    printf("Действительный размер файла: 9270 байт\n");
 
    fin = fopen("picture1.bmp","rb+");
    fread( &pragma, sizeof(BITMAPFILEHEADER_PRAGMA), 1, fin );
    printf("bfSize c #pragma:\t%ld\n", pragma.bfSize);
    fclose(fin);
 
    fin = fopen("picture1.bmp","rb+");
    fread( &nopragma, sizeof(BITMAPFILEHEADER_NOPRAGMA), 1, fin );
    printf("bfSize без #pragma:\t%ld\n", nopragma.bfSize);
    fclose(fin);
 
    return 0;
}
Миниатюры
Использование #pragma pack(push,1)... pack(pop)  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2012, 21:22
Цитата Сообщение от novi4ok Посмотреть сообщение
я так понял, что если писатель написал УРА, то по ссылке - работающий код?
А что мешает взять да проверить?
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.05.2012, 22:02
Цитата Сообщение от novi4ok Посмотреть сообщение
хотя в ссылке вроде УРА написано, так что автор нам просто причину может назвать в деталях.
в линуксе не используется WinAPI

PS: хотя может быть кто-то и использует
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.05.2012, 23:34
мы, мне кажется, все трое "говорим параллельно". я не понимаю вообще, в чем проблема и что нужно проверять, при чем здесь winapi в линухе и пр. стою на шланге, короче, sorry ...

все люди действительно умерли, потому что ели огурци?
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
29.05.2012, 06:01
Цитата Сообщение от programina Посмотреть сообщение
в Линуксе не правильно отображались данные заголовка .bmp рисунка
Дело в том, что они всеравно неправильно отображаются, потомучто при попытке открыть файл, кот. в виндовс отобразился правильно, в линуксе, отобразится неправильно.
Миниатюры
Использование #pragma pack(push,1)... pack(pop)   Использование #pragma pack(push,1)... pack(pop)  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.05.2012, 08:51
Думаю, что у тебя 32-битная винда и 64-битный линукс. Либо наоборот. В таких случаях когда видишь разные результаты, то первым делом надо смотреть за использованием типа long, т.к. он 32-битный в режиме 32 и 64-битный в режиме 64. Вообще для программы, которая должна работать в режиме 32 и 64, описывая одинаково оду и ту же структуру данных, использование long'а недопустимо. Вернее, использовать можно, но только под макросами

Добавлено через 1 минуту
В печать помимо полей нужно распечатать sizeof твоей структуры

Добавлено через 38 минут
Один из способов выяснения смещений полей внутри структуры - это использование макроса, обычно его называют OFFSETOF (или всякие вариации на эту тему типа __OFFSETOF, __offsetof и т.п.). Результатом работы макроса будет байтовое смещение заданного поля внутри заданной структуры или объединения

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
#define OFFSETOF(_type, _field) \
 ((int) (((char*)&((_type *)0)->_field) - ((char*)0)))
 
struct s1
{
  short x;
  int y;
  char z;
};
 
struct s2
{
  char a;
  struct s1 b;
};
 
 
int
main (void)
{
  printf ("%d\n", OFFSETOF (struct s1, x));
  printf ("%d\n", OFFSETOF (struct s1, y));
  printf ("%d\n", OFFSETOF (struct s1, z));
 
  printf ("%d\n", OFFSETOF (struct s2, a));
  printf ("%d\n", OFFSETOF (struct s2, b));
  printf ("%d\n", OFFSETOF (struct s2, b.x));
  printf ("%d\n", OFFSETOF (struct s2, b.y));
  printf ("%d\n", OFFSETOF (struct s2, b.z));
 
  return 0;
}
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
29.05.2012, 11:20
Evg, спасибо большое, у меня действительно 32-битный виндовс 7 и 64-битный линукс минт (вы телепат?)

PS: обязательно оставлю отзыв, но чуть позже
PPS: сижу значит в блогах и читаю всякие записи, и попадается мне ваша запись про директивы, но там еще не написано про #pragma, уже хотела оставить коммент с просьбой рассказать про эту прагму, но в последний момент передумала и зашла в гугл, который выдал эту тему
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.05.2012, 11:25
Цитата Сообщение от programina Посмотреть сообщение
вы телепат?
Это называется "experience". Когда наступаешь на грабли, то потом их видишь издалека

Цитата Сообщение от programina Посмотреть сообщение
запись про директивы, но там еще не написано про #pragma
Статья про препроцессорные директивы. #pragma к ним не относится
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.05.2012, 11:27
теперь все ясно. но я бы, если бы передо мной стояла такая задача, начал бы не с того, чтобы "немножко подумать", а с того, "как бы это увидеть". т.е. создал бы такую структуру в обеих системах и вывел бы memory dump. и все увидел бы очень быстро.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.05.2012, 11:27
Помогаю со студенческими работами здесь

Pack() [function.pack]: Type H: illegal hex digit m in
Возникла довольно странная проблема, при загрузке страницы вылезает Warning: pack() : Type H: illegal hex digit m in, в чем может быть...

Сделать так чтобы если вводится push выполнялась функция push, если pop то pop
Помогите пожалуйста с данным вопросом: например у меня есть список и несколько возможных с ним операций (например push - добавить элемент...

Push, Pop
Вот такое задание: F=Ʃ от 1 до 5 f (Ai) A1=2 Ai+1=Ai+2 Ai=(3*A)+(C/D). Нужно записать эту формулу в ассемблере с помощью Push, Pop...

push и pop
У меня возникла странная проблема. Мы создали сайт на основе системы управления, которой пользовались не один раз. Все сайты нормально...

Функции pop и push
Здравствуйте, есть код, решающий задачу. В нем есть стандартные функции push и pop. Как можно расписать функции подробно pop и push?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru