简约 网站模板曼联目前积分榜
转载需经作者同意,并注明出处
前言
我的一块板子,好像不支持多线程。于是我想到了python中的生成器。
就是这个MCU:ATMEGA168P
文章看着玩玩而已,仅供学习和娱乐。
正文
首先定义一个测试的函数。(姑且叫它生成器好了)
功能是从1数到a。(类似python的range
)
int func(void** func_save, char *func_flag, int a){return 0;}
参数中的func_save
是这个生成器的参数与局部变量的保存区域,func_flag
是它的运行状态。
这里简单地将0
作为起始状态,1
作为运行状态,2
作为结束状态。
这个结构体就是用来保存生成器的东东。
// The data of the running function.typedef struct {int arg_0; int counter;} func_object;
一开始,初始化的时候在内存中开辟一块区域,存放生成器的参数与局部变量。
if (!*func_save && !(*func_flag)) {*func_save = calloc(1, sizeof(func_object));((func_object*)*func_save) -> arg_0 = a;*func_flag = 1;}
当然有开始就要有结束,做事不能够虎头蛇尾。
// Exit status.if(((func_object*)*func_save) -> counter >= ((func_object*)*func_save) -> arg_0){free(*func_save);*func_save = NULL;*func_flag = 2;}
然后在这两片代码中间插入主要的代码。
如果使用类似状态机或断点的设计,则需要在结构体中存放相应的状态
(使用时通常用switch...case...
)
// Execute the main function.((func_object*)*func_save) -> counter ++;
然后在函数的末尾将生成结果返回。(把最开始的)return 0
去掉
// Yield value.return ((func_object*)*func_save) -> counter;
这样一个简易的生成器就造好了
有什么问题呢?
我们先写一段代码测试一下
int main(void){void *f1 = 0