值类型" void"无法分配给类型" void(*)(struct * Queue,int)的实体

时间:2015-05-09 15:30:53

标签: c struct function-pointers

我有以下结构:

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 *)" 

Dequeue函数实现是:

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

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

这里的主要问题是@Override public boolean onContextItemSelected(android.view.MenuItem item) { int selected_item__position = //here I want to get the selected item from the Action bar drop down isEmptyFuncisFullFuncEnqueueFunc,都是函数指针。你试图把一个函数调用的返回值,(这里,这不是函数指针,我们可以假设)。那是完全错误的。 很好,你不应该这样做。

现在,如果我们看到,在你的情况下

  

前三个作业似乎没问题,

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

  

但是对于第四个,编译器尖叫:

在这种情况下,int函数返回类型为Dequeue(),不能用作。所以,编译器(谢天谢地)抱怨。

TL; DR 您需要更改所有以上语句。