搜索
bottom↓
回复: 20

如何动态生成函数指针

[复制链接]

出0入0汤圆

发表于 2021-6-1 09:58:31 | 显示全部楼层 |阅读模式
请教大神,如何动态生成函数指针:
如下
typedef void (*PFUN)(void)

void taskConstruct(PFUN fn, const uint8_t period)
{
    _SS
    WaitX(period);
    fn();
    _EE
}

PFUN taskCreate(PFUN fn, const uint8_t period)
{
    taskConstruct(fn, period);

    return taskConstruct;
}

我希望每次taskCreate返回一个新的taskConstruct函数指针,而不是固定的或者要提前写好可能的函数,把指针映射过来。

出0入0汤圆

发表于 2021-6-1 10:28:41 | 显示全部楼层
先说最终目的是什么,看不明白 taskCreate() 返回 taskConstruct 的函数指针是要做啥,不应该返回一个指向新分配 task context 结构体的指针吗?

出0入0汤圆

发表于 2021-6-1 11:41:06 | 显示全部楼层
你是希望构造一个类一样的内置成员函数?

相当于Create可以构造一个在内存中的函数?这个理论上是可行的,就是C的面对对象编程呗。

出0入0汤圆

发表于 2021-6-1 13:36:42 | 显示全部楼层
你那个函数是留着让机器运行时帮你写?

出0入20汤圆

发表于 2021-6-1 13:37:56 | 显示全部楼层
二级指针可以指向一切,如果不怕炸的话

出0入0汤圆

 楼主| 发表于 2021-6-1 13:45:27 | 显示全部楼层
wudicgi 发表于 2021-6-1 10:28
先说最终目的是什么,看不明白 taskCreate() 返回 taskConstruct 的函数指针是要做啥,不应该返回一个指向 ...

目的:taskCreate被调用一次,就生成一个新的taskConstruct函数,并获得这个函数指针。

出0入0汤圆

 楼主| 发表于 2021-6-1 13:46:39 | 显示全部楼层
FireHe 发表于 2021-6-1 11:41
你是希望构造一个类一样的内置成员函数?

相当于Create可以构造一个在内存中的函数?这个理论上是可行的, ...

是的,但51单片机资源很有限,不能做得太复杂,精简实现这个功能

出0入0汤圆

 楼主| 发表于 2021-6-1 13:47:41 | 显示全部楼层
liurangzhou 发表于 2021-6-1 13:36
你那个函数是留着让机器运行时帮你写?

应用层调用一次就生成一个,有上限。

出0入0汤圆

发表于 2021-6-1 13:56:26 | 显示全部楼层
MegaHealth 发表于 2021-6-1 13:47
应用层调用一次就生成一个,有上限。

你迷失在自己的想法中,目前阶段我看你的函数应该都是已经写好的,不知道你要实现啥功能

出200入2554汤圆

发表于 2021-6-1 15:01:47 来自手机 | 显示全部楼层
1. C编译器不能直接实现C++动态生成类实例功能,就连malloc也是预定个缓存区当作堆,在里边动态申请

2. 可以通过模拟方法实现类功能,但基本就是人肉C++编译,大致思路:每个动态的位于内存中运行的函数,可以抽象成只读代码+动态局部变量,前者可以共用ROM区数据,后者就是RAM的动态结构体数组,而这个动态数组又是依赖于malloc这样堆接口完成的。

3. 实现上述人肉C++编译,绝对不会比你把动态运行函数抽象成数据结构体更简单。在只有C的51上,正道是抽象成结构体再动态插入结构体数组,而非生成动态函数

出0入8汤圆

发表于 2021-6-1 16:10:02 | 显示全部楼层
有什么可能会有这样的需求? 单片机要做什么能做什么不是事先已经定好的啊,  



出0入0汤圆

 楼主| 发表于 2021-6-2 09:17:23 | 显示全部楼层
icoyool 发表于 2021-6-1 16:10
有什么可能会有这样的需求? 单片机要做什么能做什么不是事先已经定好的啊,  

需要创建任务

出0入0汤圆

 楼主| 发表于 2021-6-2 09:19:39 | 显示全部楼层
t3486784401 发表于 2021-6-1 15:01
1. C编译器不能直接实现C++动态生成类实例功能,就连malloc也是预定个缓存区当作堆,在里边动态申请

2. 可 ...

好的,谢谢

出300入477汤圆

发表于 2021-6-2 09:33:25 来自手机 | 显示全部楼层
MegaHealth 发表于 2021-6-2 09:19
好的,谢谢

你要创建的任务当然只能是你已经写好的处理函数啊,所以你已经有这个处理函数的函数指针。
想创建哪个任务,就用这个已经写好的函数的指针来创建。
你无法创建预先没有写好的任务。因为你不能动态生成函数代码。除非弄个脚本系统,但是51上面也跑不动什么脚本系统

出0入8汤圆

发表于 2021-6-2 11:02:50 | 显示全部楼层

兄弟, 你之前不会是做windows开发的吧,
单片机哪里有创建任务的概念啊
无非就是调用一个一个的函数而已,
如果你要做任务管理可以考虑把所有的函数用汇总到一个总入口, 大函数里面传一个void指针就可以了, 参数都写在void 指针指向的结构体

出0入16汤圆

发表于 2021-6-3 11:02:25 | 显示全部楼层
即使能创建函数完全是浪费吧,形参换成结构体指针就行了。。。。C语言又没有this指针,创建出来的函数有个毛用,还不如直接C++

出0入8汤圆

发表于 2021-6-4 10:26:42 | 显示全部楼层
楼主想要的东西叫工厂模式,调用一次,根据不同的需求,返回不同的函数实例。而且这个不同的实例,还不是预定义的,是调用期动态生成的,甚至是智能感知场景,按需生成。

出0入0汤圆

 楼主| 发表于 2021-6-8 08:54:23 | 显示全部楼层
uindex 发表于 2021-6-4 10:26
楼主想要的东西叫工厂模式,调用一次,根据不同的需求,返回不同的函数实例。而且这个不同的实例,还不是预 ...

是这样的

出0入0汤圆

发表于 2021-6-8 09:01:00 来自手机 | 显示全部楼层
C实现不了虚函数的多态

出0入8汤圆

发表于 2021-6-8 09:12:20 | 显示全部楼层

只能说在 51 上面,就不要想太多了。

出0入93汤圆

发表于 2021-6-8 10:13:56 | 显示全部楼层

上脚本哇,除了慢外,这都不是事
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 19:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表