为什么我收到“来自不兼容指针类型的分配”错误?

时间:2013-04-14 18:03:02

标签: c pointers

我不断收到此错误,但无法弄清楚原因。任何帮助将不胜感激。

这是我的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函数?提前致谢。

3 个答案:

答案 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 *)的指针,但returnPricefloat(stock_t *)。那些不一样,也不兼容。

您可以通过更改功能签名来修复它:

float returnPrice(void * p)
{ 
    stock_t * S = p;
    S->getPrice = &returnPrice;
}