gpt4 book ai didi

c - 类型 "void"的值不能分配给类型为“void(*)(struct *Queue, int) 的实体”

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

我有以下结构:

typedef struct{
int *arr;
int maxSize, curSize;
int first, last;
int(*isEmptyFunc)(Queue);
int(*isFullFunc)(Queue);
void(*EnqueueFunc)(struct Queue*, int);
void(*DequeueFunc)(struct Queue*);
int(*TopFunc)(Queue);
} Queue;

还有一个创建队列函数,它返回指向新队列的指针:

    int *arr = malloc(sizeof(int) * size);
isNull(arr);
Queue *q = malloc(sizeof(Queue));
isNull(q);

当我尝试为函数指针赋值时,我会这样做:(这一切都发生在CreateQueue函数中)

q->isEmptyFunc = isEmpty(*q);
q->isFullFunc = isFull(*q);
q->TopFunc = Top(*q);
q->DequeueFunc = Dequeue(q);

实际函数在我包含在 .c 文件顶部的头文件中声明,并在 CreateQueue 函数下方实现。前三个赋值似乎没问题,但对于第四个赋值,编译器会尖叫:

IntelliSense: a value of type "void" cannot be assigned to an entity of type "void (*)(struct Queue *)" 

出队函数的实现是:

void Dequeue(Queue *q) {
if (q->isEmptyFunc()) return;
q->first = (q->first + 1) % (q->maxSize);
q->curSize--;
}

这是怎么回事?

最佳答案

这里的主要问题是,isEmptyFuncisFullFuncEnqueueFuncDequeueFunc,都是函数指针。您试图输入函数调用的返回值(这里,我们可以假设它不是函数指针)。这是完全错误的。这是不好的,你不应该这样做。

现在,如果我们看到,就你的情况而言

The first three assignments seem to be fine,

编译器在这里不会提示,因为所有三个函数调用都返回一些值(可能是 int?),并且该值隐式转换为函数指针 类型,但是,行为未定义。你绝对不能这样做。

but for the fourth the compiler screams:

在这种情况下,Dequeue() 函数返回类型为 void,不能用作。所以,编译器(谢天)正在提示。

TL;DR您需要更改上述所有声明。

关于c - 类型 "void"的值不能分配给类型为“void(*)(struct *Queue, int) 的实体”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30141785/

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