Объединение двух структур в новую на C? - PullRequest
0 голосов
/ 04 апреля 2011

Итак, у нас интересная ситуация.Мы должны написать СУБД на C под Linux, и у нас возникает следующая проблема: при попытке объединить два отношения / таблицы новое отношение / таблица имеет число полей / столбцов, равное сумме обоих соединяющих отношений / таблиц.Это хорошо, но когда нам нужно скопировать данные кортежа / строки из двух соединяющих отношений / таблиц, мы, похоже, не можем найти способ.Кортежи / строки реализуются как элементы списка с помощью этой структуры:

typedef struct element {
    void *data;
    struct element *next;
} Element;

Новый элемент создается с помощью этой функции:

Element *
newElement (void *data)
{
    Element *e = (Element*) malloc (sizeof (Element));
    assert (e != NULL);
    e->data = data;
    e->next = NULL;

    return e;
}

И параметр данных * передается с этого моментатип:

typedef struct {
    int sid;
    char sname[STRLEN];
    int rating;
    float age;
} Sailor;

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

Пожалуйста, помогите.

1 Ответ

1 голос
/ 04 апреля 2011

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

Сначала определите базовую структуру, которая имеет только идентификатор типа

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, чтобы она также содержала размер сегмента данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...