gpt4 book ai didi

在 C 上将两个结构组合成一个新的结构?

转载 作者:行者123 更新时间:2023-11-30 16:02:16 24 4
gpt4 key购买 nike

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

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;
}

并且 *data 参数以此类型传递:

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

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

请帮忙。

最佳答案

鉴于您无法在运行时定义新结构,类似以下内容(黑客?)可以工作..

首先定义一个只有类型id的基础结构

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;

现在将数据段视为这些结构的容器,例如,我将在数据中有两个结构(即连接上述两个结构),我的数据段将如下所示:

----------
| Sailor |
+--------+
| Boat |
----------

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

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

关于在 C 上将两个结构组合成一个新的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5536957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com