Учитывая, что вы не можете во время выполнения определить новые структуры, может сработать что-то вроде следующего (хак?).
Сначала определите базовую структуру, которая имеет только идентификатор типа
typedef struct
{
int type_id; /* this holds a number which identifies the following structure */
} TypeID;
/* now all structures should contain this */
typedef struct {
TypeID type;
char sname[STRLEN];
int rating;
float age;
} Sailor;
typedef struct {
TypeID type;
char sname[STRLEN];
int sailors;
} Boat;
Теперь обработайте сегмент данных как контейнер из этих структур, скажем, например, что у меня будет две структуры данных (т.е. соединенные две вышеупомянутые структуры), мой сегмент данных будет выглядеть так: 1008 *
----------
| Sailor |
+--------+
| Boat |
----------
При чтении блока данных сначала приведите его к TypeID
, который даст вам тип, а затем вы можете привести его к реальной структуре. Затем, если в сегменте данных больше данных, переместите указатель на размер структуры, которую вы только что прочитали, и снова выполните тот же процесс. По сути, это позволяет вам иметь сегмент переменной длины, представляющий собой набор структур разных типов - то есть, ваша объединенная структура данных.
Да, и вам нужно изменить структуру Element
, чтобы она также содержала размер сегмента данных.