1

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

这是我的 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;

    }

它在 .c 文件中我将 getPrice 指针设置为等于 returnPrice 函数的行中,我得到了错误。我应该如何定义 assign getPrice 以使其指向 returnPrice 函数?提前致谢。

4

3 回答 3

3

setPrice期望的原型float (* getPrice) (void * S);意味着setPrice期望函数的参数接受指向任何数据类型的指针。但是,您的returnPrice方法更具限制性,因为float returnPrice (stock_t *S)它仅适用于/期望 astock_t*作为参数,因此不符合setPrice指针的标准。

您需要声明float returnPrice (void *S)然后S在函数内部进行强制转换才能正常工作。或者转换函数指针本身。

typedef float (*GetPriceFunction) (void * S);

typedef struct stock 
{
    GetPriceFunction getPrice;
}

S->getPrice = (GetPriceFunction)returnPrice;
于 2013-04-14T18:11:01.660 回答
1

float (*) (void*)并且float (*) (stock_t*)是不同的类型,因此投诉。

要定义您的函数,您可以使用例如以下语法:

typedef struct stock stock_t;
struct stock {
   ...
   float (* getPrice) (stock_t * S);
   ...
};

void*除非绝对必须,否则不要使用and casts。在这种情况下,您不必这样做。其他答案告诉您继续使用void*. 我恭敬地认为这是不明智的。

我不确定你为什么要在你做的地方做函数指针分配。这可能是错误的,尽管与编译器消息无关。

于 2013-04-14T18:18:04.240 回答
0

这是因为S->getPrice是指向 a 的指针float(void *),但是returnPrice是 a float(stock_t *)。它们不一样,也不兼容。

您可以通过更改函数签名来修复它:

float returnPrice(void * p)
{ 
    stock_t * S = p;
    S->getPrice = &returnPrice;
}
于 2013-04-14T18:12:14.813 回答