MegaHealth 发表于 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函数指针,而不是固定的或者要提前写好可能的函数,把指针映射过来。

wudicgi 发表于 2021-6-1 10:28:41

先说最终目的是什么,看不明白 taskCreate() 返回 taskConstruct 的函数指针是要做啥,不应该返回一个指向新分配 task context 结构体的指针吗?

FireHe 发表于 2021-6-1 11:41:06

你是希望构造一个类一样的内置成员函数?

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

liurangzhou 发表于 2021-6-1 13:36:42

你那个函数是留着让机器运行时帮你写?

Error.Dan 发表于 2021-6-1 13:37:56

二级指针可以指向一切,如果不怕炸的话

MegaHealth 发表于 2021-6-1 13:45:27

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

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

MegaHealth 发表于 2021-6-1 13:46:39

FireHe 发表于 2021-6-1 11:41
你是希望构造一个类一样的内置成员函数?

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

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

MegaHealth 发表于 2021-6-1 13:47:41

liurangzhou 发表于 2021-6-1 13:36
你那个函数是留着让机器运行时帮你写?

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

liurangzhou 发表于 2021-6-1 13:56:26

MegaHealth 发表于 2021-6-1 13:47
应用层调用一次就生成一个,有上限。

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

t3486784401 发表于 2021-6-1 15:01:47

1. C编译器不能直接实现C++动态生成类实例功能,就连malloc也是预定个缓存区当作堆,在里边动态申请

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

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

icoyool 发表于 2021-6-1 16:10:02

有什么可能会有这样的需求? 单片机要做什么能做什么不是事先已经定好的啊,



MegaHealth 发表于 2021-6-2 09:17:23

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




需要创建任务

MegaHealth 发表于 2021-6-2 09:19:39

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

2. 可 ...

好的,谢谢

redroof 发表于 2021-6-2 09:33:25

MegaHealth 发表于 2021-6-2 09:19
好的,谢谢

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

icoyool 发表于 2021-6-2 11:02:50

MegaHealth 发表于 2021-6-2 09:17
需要创建任务

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

初音之恋 发表于 2021-6-3 11:02:25

即使能创建函数完全是浪费吧,形参换成结构体指针就行了。。。。C语言又没有this指针,创建出来的函数有个毛用,还不如直接C++

uindex 发表于 2021-6-4 10:26:42

楼主想要的东西叫工厂模式,调用一次,根据不同的需求,返回不同的函数实例。而且这个不同的实例,还不是预定义的,是调用期动态生成的,甚至是智能感知场景,按需生成。

MegaHealth 发表于 2021-6-8 08:54:23

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

是这样的

tianheyun12 发表于 2021-6-8 09:01:00

C实现不了虚函数的多态

security 发表于 2021-6-8 09:12:20

MegaHealth 发表于 2021-6-8 08:54
是这样的

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

takashiki 发表于 2021-6-8 10:13:56

MegaHealth 发表于 2021-6-8 08:54
是这样的

上脚本哇,除了慢外,这都不是事
页: [1]
查看完整版本: 如何动态生成函数指针