我不断收到此错误,但无法弄清楚原因。任何帮助将不胜感激。
这是我的stock.h文件。
typedef struct stock {
char *stockSymbol;
float closingSharePrice;
float openingSharePrice;
int numberOfShares;
float (* getPrice) (void * S);
float (* getTotalDollarAmount) (void * S);
float (* getPercentChange) (void * S);
char * (* toString)(void * S);
} stock_t;
float returnPrice (stock_t *S);
float returnTotal (stock_t *S);
float returnPercentChange (stock_t *S);
char * returnString (stock_t *S);
这是我的stocks.c文件。
#include <stdio.h>
#include <stdlib.h>
#include "stocks.h"
float returnPrice (stock_t *S) {
S->getPrice = returnPrice;
}
在我设置getPrice指针等于returnPrice函数的行中的.c文件中,我得到了错误。我应该如何定义赋值getPrice以使其指向returnPrice函数?提前致谢。
答案 0 :(得分:3)
setPrice
期望的原型是float (* getPrice) (void * S);
,这意味着setPrice
期望函数的参数接受指向任何数据类型的指针。但是,您的returnPrice
方法比float returnPrice (stock_t *S)
更具限制性,因此它仅适用于/期望stock_t*
作为参数,因此不符合setPrice
指针的条件。
您需要声明float returnPrice (void *S)
,然后在函数内部转换S
才能使其正常工作。或者自己投射函数指针。
typedef float (*GetPriceFunction) (void * S);
typedef struct stock
{
GetPriceFunction getPrice;
}
S->getPrice = (GetPriceFunction)returnPrice;
答案 1 :(得分:1)
float (*) (void*)
和float (*) (stock_t*)
是不同的类型,因此抱怨。
要定义您的功能,您可以使用例如这句语法:
typedef struct stock stock_t;
struct stock {
...
float (* getPrice) (stock_t * S);
...
};
除非绝对必要,否则不要使用void*
和强制转换。在这种情况下,你不必这样做。其他答案告诉您继续使用void*
。我恭敬地提出这是不明智的。
我不确定你为什么要在你所在的地方进行功能指针分配。这可能是错误的,但与编译器消息无关。
答案 2 :(得分:0)
这是因为S->getPrice
是指向float(void *)
的指针,但returnPrice
是float(stock_t *)
。那些不一样,也不兼容。
您可以通过更改功能签名来修复它:
float returnPrice(void * p)
{
stock_t * S = p;
S->getPrice = &returnPrice;
}