Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
51
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
      1. Более сложная структура

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

Вот более сложная структура:

typedef struct simp2 {

/* Скаляр и ссылка на скалярный массив */

int num_ref_vals;

int *ref_vals;

/* Скалярный массив */

int nums_10[10];

/* Скалярный массив (не эндиан-чувствительный) */

char first_name[10];

/* ССылка на строку */

char *last_name2;

/* Скалярный массив */

short vals_5[5];

/* Член зарегистрированного типа */

Simp1_t simp1_instance;

/* Массив членов зарегистрированного типа */

Simp1_t simp1_array[4];

/* Ссылка на зарегистрированный тип */

Simp1_t *simp1_reference;

/* Скаляр и ссылка на массив зарегистрированных типов */

int num_simps;

Simp1_t *ref_simp1_array;

/* Скаляр и ссылка на массив ссылок зарегистрированных типов */

int num_simp_refs;

Simp1_t **ref_simp1_ref_array;

/* Два скаляра и ссылка на данные произвольного объёма */

short bm_height;

int bm_bpl;

char *bitmap;

/* Нечто, что мы не хотим паковать, но хотим очистить после распаковки */

char *dont_pack_this;

} Simp2_t;

          1. Список ссылок на очистку

Вот список clear_refs для этой структуры:

static const int unsigned Simp2ClearRefs[] = {

offsetof( Simp2_t, dont_pack_this ),

0 /* Конец списка ссылок на очистку */

};

          1. Эндиан-список

Вот эндиан-список для этой структуры:

static const int unsigned Simp2Endians[] = {

Tr_ENDIAN( Simp2_t, num_ref_vals ),

Tr_ENDIAN_REF( Simp2_t, ref_vals ),

Tr_ENDIAN_ARRAY( Simp2_t, nums_10 ),

Tr_ENDIAN_ARRAY( Simp2_t, vals_5 ),

0 /* Конец эндиан-списка */

};

Вот полный список эндиан-декларации для каждого типа членов:

Скаляр (char)

Отсутствует

Скаляр (short)

Tr_ENDIAN( type, member )

Скаляр (int)

Tr_ENDIAN( type, member )

Скалярный массив (char)

Отсутствует

Скалярный массив (short)

Tr_ENDIAN_ARRAY( type, member )

Скалярный массив (int)

Tr_ENDIAN_ARRAY( type, member )

Ссылка (char)

Отсутствует

Ссылка (short)

Tr_ENDIAN_REF( type, member )

Ссылка (int)

Tr_ENDIAN_REF( type, member )

Ссылка (массив char)

Отсутствует

Ссылка (массив short)

Tr_ENDIAN_REF( type, member )

Ссылка (массив int)

Tr_ENDIAN_REF( type, member )

Простая структура

Список каждого эндиан-чувствительного члена структуры членов

Зарегистрированный тип

Отсутствует

Ссылка на зарегистрированный тип

Отсутствует

Например, для структуры Sample_t:

int i;

Tr_ENDIAN( Sample_t, i )

int array[7];

Tr_ENDIAN_ARRAY( Sample_t, array )

short *short_nums;

Tr_ENDIAN_REF( Sample_t, short_nums )

int *long_nums;

Tr_ENDIAN_REF( Sample_t, long_nums )

struct my_simp ms;

Tr_ENDIAN( Sample_t, ms.width ), Tr_ENDIAN( Sample_t, ms.height )

Соседние файлы в папке Литература