首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个结构组合成C上的新结构?

问将两个结构组合成C上的新结构?
EN

Stack Overflow用户
提问于 2011-04-04 09:59:56
回答 1查看 7K关注 0票数 0

所以,我们有一个有趣的情况。我们应该在Linux下用C编写DBMS,我们有以下问题:当试图连接两个关系/表时,新的关系/表的字段/列数等于两个连接关系/表的和。这很好,但是当我们必须从两个连接关系/表中复制元组/行的数据时,我们似乎找不到一种方法。元组/行通过以下结构实现为列表元素:

代码语言:javascript
复制
typedef struct element {
    void *data;
    struct element *next;
} Element;

新元素是通过以下函数创建的:

代码语言:javascript
复制
Element *
newElement (void *data)
{
    Element *e = (Element*) malloc (sizeof (Element));
    assert (e != NULL);
    e->data = data;
    e->next = NULL;

    return e;
}

并且*数据参数以这种类型传递:

代码语言:javascript
复制
typedef struct {
    int sid;
    char sname[STRLEN];
    int rating;
    float age;
} Sailor;

问题是,当我们必须连接两个关系时,我们无法知道它们对其元组/行所使用的结构,因此我们不能从两个连接关系的元组/行中为新关系创建新的元组/行。

请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2011-04-04 10:15:20

如果您不能在运行时定义新的结构,如下所示(hack?)可以工作..。

首先,定义一个只具有类型id的基结构。

代码语言:javascript
复制
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;

现在将数据段视为这些结构的容器,例如,我将在数据中包含两个结构(即加入上述两个结构),我的数据段看起来如下:

代码语言:javascript
复制
----------
| Sailor |
+--------+
|  Boat  |
----------

当读取数据块时,首先将其转换为TypeID,这给您提供了类型,然后您可以将其转换为真正的结构。然后,如果数据段中有更多的数据,按照刚才读取的结构的大小移动指针,然后再次执行相同的过程。基本上,这允许您有一个可变长度段,它是一组不同类型的结构--即连接的数据结构。

哦,您还需要修改Element结构以保存数据段的大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5536957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档