gpt4 book ai didi

c - 克服C中缺乏多态性的问题

转载 作者:行者123 更新时间:2023-11-30 14:31:51 25 4
gpt4 key购买 nike

我正在开发一个项目,严格要求用 C 语言实现两组具有相同签名的函数,这些函数可以从一个 .c 测试文件中使用。一组用于数据结构,另一组用于不同且不兼容的数据结构。由于在 C 中不存在多态性,因此不可能调用在两个不同头文件 (.h) 文件中具有相同签名的两个实现的函数,并且理所当然地认为该调用将引用实际函数的正确实现。能够管理正确的数据结构。好吧,我知道这看起来不可能而且矛盾,但是……就是这样……我必须合并两个通用项目,可以是列表或动态数组更新:在 List.h 上(dynamicArray 在另一个 .h 中)

    typedef struct Node{
void *data;
struct Node *next, *prevNode;
} Node;

//typedef struct declaration List
typedef struct List {
struct Node *top, *bot, *prev;
int size;
} List;



//in the dynamicarray.h file:
typedef struct dynamicArray{
void **array;
size_t size;
size_t capacity;
}dynArray;



//in the dynamicarray.h file:
void* merge(void *element1,void *element2, int parameters){
void * returner;

if (parameters==ARRAY) {
returner= Array_Merge(element1,element2); // expected to receive two arrays
}
else {
returner= List_Merge(element1,element2); // expected to reveice two lists
}

return returner;
}

您对完成此请求有什么建议吗?谢谢。

最佳答案

您需要将指向函数的指针和一些处理函数以及参数一起传递给测试。在 'c' 中,void * 可以用来代替任何指针。像下面这样的东西可能适合你:

int mytest(void*(*function)(void *), int(*handler)(void *), void *arg) {
if (handler(function(arg)))
return OK;
return FAIL;
}

因此,您只需要为数组和列表设置单独的处理函数,并将它们与其他参数一起传递给测试函数。

回答您的最新评论

我可以想象如下的一些方案。

List list1;
dyArray array1;

MergedList outList;
MergedArray outArray;
...

void *getNextArrayElement(dynArray *array){...}
void *getNextListElement(List *list){...}

int mergeAsList(void* el, void *list){
if (el == NULL)
return 0;
ListMember *mmb = malloc(sizeof(ListMember));
mmb->el = el;
mmb->next = ((MergeList*)list)->head;
(MergeList*)mergeList->head = mmb;
return 1;
}

int mergeAsArray(void *el, void *array) {
if (el == NULL)
return 0;
if (((MergeArray *)array)->index) >= MAX)
return 0;
((MergeArray *)array)[((MergeArray *)array)->index++] = el;
return 1;
}
int mergeAsSortedArray(void *el, void *array){...}
...

test(getNextArrayEelement, mergeAsList, &arraty1, &outList);
test(getNextListEelement, mergeAsList, &list1, &outArray);
...

int test (void *(get*)(void*),
int (merge*)(void *m1, void *result),
void *in,
void *out) {
void *el = get(in);
int res = merge(el, out);
return res;
}

关于c - 克服C中缺乏多态性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60047121/

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