我需要在C语言上创建几种数据结构之一(例如:DynamicArray、BST、HashMap、Trie)的实例。从文件中读取数据结构的名称,然后必须创建数据类型的实例;一般来说,我需要开发多态性,但我不知道如何在运行时创建结构实例;我知道有一个空指针函数的解决方案,但我不知道如何......
注意:我需要创建一个读取文件的应用程序。该队列有 6 种队列变体(二叉堆、二项式堆、左堆、倾斜堆、斐波那契堆和 Treap)和 4 种容器变体(Vector、HashMap、Trie、BST)。如果我不开发某种多态性,那么我需要处理 24 个不同的情况,因为源文件中的数据是意外生成的。 测试文件示例:
LeftistHeap - queue
Trie - container
06:18:39 03/05/24 - time start
06:28:39 03/05/24 - time finish
42 - min time for 1 request
53 - max time for 1 request
14 - number of departments
15 25 44 47 48 39 38 32 37 28 11 45 27 11 - count for each department
我尝试使用 Generic 来解决这个问题,但它没有解决我的问题;
编译错误:
void错误:“void”类型的“_Generic”选择器与任何关联都不兼容
void vec() {
printf("Vector\n");
}
void bst() {
printf("bst\n");
}
void ht() {
printf("Ht\n");
}
#define TEST_FUNC(X) _Generic((X), \
Vector: vec, \
BST: bst, \
Hash_Table: ht \
)
int main()
{
char* in = "Vector";
void* data = NULL;
if (strcmp(in, "Vector") == 0) {
data = (Vector*)malloc(sizeof(Vector));
} else if (strcmp(in, "BST") == 0) {
data = (BST*)malloc(sizeof(BST));
}
TEST_FUNC(*data);
}
_Generic((X)
宏在编译期间使用,而不是在运行时使用。所以你不能在你的情况下使用它。请记住:分配 void *
时的强制转换不会将其转换为另一种类型的指针。
您需要在运行时执行此操作。示例:
typedef struct
{
int dummy[5];
}BST;
typedef struct
{
int dummy[15];
}VECTOR;
typedef struct
{
int dummy[25];
}HT;
void vec(VECTOR *v) {
printf("Vector\n");
}
void bst(BST *bst) {
printf("bst\n");
}
void ht(HT *ht) {
printf("Ht\n");
}
typedef enum
{
BST_T,
VECTOR_T,
HT_T,
UNKNOWN_T,
}type_t;
void TEST_FUNC(void *data, const type_t type)
{
switch(type)
{
case VECTOR_T:
vec(data);
break;
case BST_T:
bst(data);
break;
case HT_T:
ht(data);
break;
default:
printf("Unknown type\n");
break;
}
}
int main()
{
char* in = "Vector";
size_t size = 0;
type_t type = UNKNOWN_T;
void *data = NULL;
if (!strcmp(in, "Vector")) { size = sizeof(VECTOR); type = VECTOR_T;}
else if (!strcmp(in, "HT")) { size = sizeof(HT); type = HT_T;}
else if (!strcmp(in, "BST")) { size = sizeof(BST); type = BST_T;}
if(size) data = malloc(size);
TEST_FUNC(data, type);
}