如何在运行时创建实例,C

问题描述 投票:0回答:1

我需要在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); 
} 
c void-pointers
1个回答
0
投票

_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); 
}
© www.soinside.com 2019 - 2024. All rights reserved.