结构体中函数指针的问题?

_故事的小黄花_ 2016-05-28 09:06:03
现在有一个头文件Clarke.h,代码如下:


源文件源文件Clarke.c(源文件#include了头文件),代码如下:


当我把这些代码复制到VS2013中时,写了个主函数,如下:


但编译时会报错,如下:


报错的意思,我理解的是,typedef struct 中定义的,名为CLARKE 结构体,里面有void(*calc)( ) 。这个函数指针,是没有参数的,但是用CLARKE_DEFAULTS,去初始化的时候,CLARKE_DEFAULTS里面的函数clarke_calc( ),它是有参数值的,参数为,一个指向CLARKE类型的结构体的指针,所以不能这么初始化。

于是,我把 CLARKE 这个结构体, 改成如下:


也就是将CLARKE 结构体里定义的函数指针void(*calc)( ),加上一个参数,变成void(*calc)( CLARKE_handle ),对于这个CLARKE_handle ,有 typedef CLARKE * CLARKE_handle 。

但此时,编译,依旧报错,如下:


请问这是怎么回事啊?谢谢大家


...全文
416 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
renwotao2009 2016-05-28
  • 打赏
  • 举报
回复
引用 8 楼 x303687305 的回复:
引用 7 楼 paschen 的回复:
[quote=引用 5 楼 x303687305 的回复:]
CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址
那请问一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?[/quote] void(*)(Uint32) 是一个函数指针,指针指向参数为Uint32,无返回的函数 不同类型的指针是不能隐式转换的 在这里是做强制转换,让他转换成这种类型函数指针 正如(int)a 就是将a转换成int类型[/quote] 非常非常感谢,我好像明白了。请问你们这些东西都是在哪学的啊?有没有好一点的书推荐一下?我有一本谭浩强的C程序设计教程,是大学时候C语言的书,写得非常浅显。 我本人并不是学编程的,是学电气的。但是很多控制算法都需要编程来实现,所以我C语言有一些弱[/quote]C primer plus也可以学习使用,建议看看或者到网上找些电子版关于c的
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
引用 5 楼 x303687305 的回复:
CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址
那请问一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?[/quote] void(*)(Uint32) 是一个函数指针,指针指向参数为Uint32,无返回的函数 不同类型的指针是不能隐式转换的 在这里是做强制转换,让他转换成这种类型函数指针 正如(int)a 就是将a转换成int类型[/quote] 非常非常感谢,我好像明白了。请问你们这些东西都是在哪学的啊?有没有好一点的书推荐一下?我有一本谭浩强的C程序设计教程,是大学时候C语言的书,写得非常浅显。 我本人并不是学编程的,是学电气的。但是很多控制算法都需要编程来实现,所以我C语言有一些弱
paschen 2016-05-28
  • 打赏
  • 举报
回复
引用 5 楼 x303687305 的回复:
CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址[/quote] 那请问一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?[/quote] void(*)(Uint32) 是一个函数指针,指针指向参数为Uint32,无返回的函数 不同类型的指针是不能隐式转换的 在这里是做强制转换,让他转换成这种类型函数指针 正如(int)a 就是将a转换成int类型
  • 打赏
  • 举报
回复
引用 4 楼 renwotao2009 的回复:
[quote=引用 3 楼 x303687305 的回复:] [quote=引用 2 楼 renwotao2009 的回复:]

void(*calc)( Uint32); // 改成这样,C和C++都是强类型语言,不符合定义编译不过
你这么一改,还真就成功了!!谢谢你!!可是我不太明白其中的原理,能再给我讲讲吗? 为什么用void(*calc)( Uint32); 这样的形式就能行呢? Uint32 代表了这个函数的参数,是无符号的32位数据类型。 可是,我实际装载的函数,是void clarke_calc(CLARKE *v),这个函数的参数,是CLARKE *v 啊? [/quote]CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址[/quote] 那请问一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?
  • 打赏
  • 举报
回复
[/quote]CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址[/quote] 那请问一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?
renwotao2009 2016-05-28
  • 打赏
  • 举报
回复
引用 3 楼 x303687305 的回复:
[quote=引用 2 楼 renwotao2009 的回复:]

void(*calc)( Uint32); // 改成这样,C和C++都是强类型语言,不符合定义编译不过
你这么一改,还真就成功了!!谢谢你!!可是我不太明白其中的原理,能再给我讲讲吗? 为什么用void(*calc)( Uint32); 这样的形式就能行呢? Uint32 代表了这个函数的参数,是无符号的32位数据类型。 可是,我实际装载的函数,是void clarke_calc(CLARKE *v),这个函数的参数,是CLARKE *v 啊? [/quote]CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址
  • 打赏
  • 举报
回复
引用 2 楼 renwotao2009 的回复:

void(*calc)( Uint32); // 改成这样,C和C++都是强类型语言,不符合定义编译不过
你这么一改,还真就成功了!!谢谢你!!可是我不太明白其中的原理,能再给我讲讲吗? 为什么用void(*calc)( Uint32); 这样的形式就能行呢? Uint32 代表了这个函数的参数,是无符号的32位数据类型。 可是,我实际装载的函数,是void clarke_calc(CLARKE *v),这个函数的参数,是CLARKE *v 啊?
renwotao2009 2016-05-28
  • 打赏
  • 举报
回复

void(*calc)( Uint32); // 改成这样,C和C++都是强类型语言,不符合定义编译不过
lm_whales 2016-05-28
  • 打赏
  • 举报
回复
C 试试 要不强制转换

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧