鱼C论坛

 找回密码
 立即注册
查看: 1607|回复: 2

[已解决]指针函数结构体混搭问题,路过的鱼油请赐教!!!

[复制链接]
发表于 2020-1-4 11:32:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//函数名列表         
struct _m_usmart_nametab
{
        void* func;                        //函数指针
        const u8* name;                //函数名(查找串)         
};
//usmart控制管理器
struct _m_usmart_dev
{
        struct _m_usmart_nametab *funs;        //函数名指针

        void (*init)(u8);                                //初始化
        u8 (*cmd_rec)(u8*str);                        //识别函数名及参数
        void (*exe)(void);                                 //执行
        void (*scan)(void);             //扫描
        u8 fnum;                                                   //函数数量
        u8 pnum;                        //参数数量
        u8 id;                                                        //函数id
        u8 sptype;                                                //参数显示类型(非字符串参数):0,10进制;1,16进制;
        u16 parmtype;                                        //参数的类型
        u8  plentbl[MAX_PARM];                  //每个参数的长度暂存表
        u8  parm[PARM_LEN];                          //函数的参数
        u8 runtimeflag;                                        //0,不统计函数执行时间;1,统计函数执行时间,注意:此功能必须在USMART_ENTIMX_SCAN使能的时候,才有用
        u32 runtime;                                        //运行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
};


//函数控制管理器初始化
//得到各个受控函数的名字
//得到函数总数量
struct _m_usmart_dev usmart_dev=
{
        usmart_nametab,
        usmart_init,
        usmart_cmd_rec,
        usmart_exe,
        usmart_scan,
        sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量
        0,                  //参数数量
        0,                 //函数ID
        1,                //参数显示类型,0,10进制;1,16进制
        0,                //参数类型.bitx:,0,数字;1,字符串            
        0,                  //每个参数的长度暂存表,需要MAX_PARM个0初始化
        0,                //函数的参数,需要PARM_LEN个0初始化
};

//函数名列表初始化(用户自己添加)
//用户直接在这里输入要执行的函数名及其查找串
struct _m_usmart_nametab usmart_nametab[]=
{

        (void*)runtimeTest,"void runtimeTest(u8 sta)",
        (void*)test_fun,"void test_fun(void(*ledset)(u8),u8 sta)",                                              
                                                                                         
};       
case 1://有1个参数
                        res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
                        break;
这是原子哥写的USMART的一段代码,有些地方看不懂
这一句(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);怎么解释? 尤其是前面的一堆括号,麻烦懂得的鱼油指点一下,谢谢!!
最佳答案
2020-1-4 15:04:13
本帖最后由 Croper 于 2020-1-4 15:07 编辑
u32(*)()
这是一个类型,表示返回类型为u32函数指针
(u32(*)())usmart_dev.funs[id].func
这是把usmart_dev.funs[id].func强制转化为上面所说的函数指针类型
(*(u32(*)())usmart_dev.funs[id].func)(temp[0])
这是调用上面哪个函数,实参为temp[0]



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-4 15:04:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2020-1-4 15:07 编辑
u32(*)()
这是一个类型,表示返回类型为u32函数指针
(u32(*)())usmart_dev.funs[id].func
这是把usmart_dev.funs[id].func强制转化为上面所说的函数指针类型
(*(u32(*)())usmart_dev.funs[id].func)(temp[0])
这是调用上面哪个函数,实参为temp[0]



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 18:06:06 | 显示全部楼层
Croper 发表于 2020-1-4 15:04
这是一个类型,表示返回类型为u32函数指针

关于静态存储区、堆、栈、数据存储区作用,和那些变量或者数据存储在那些对应的区域,有没有比较完善的资料或者链接?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 05:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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