OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8059|回复: 9

原子大哥,问个USMART调试程序代码的问题

[复制链接]

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13164
金钱
13164
注册时间
2012-11-26
在线时间
3817 小时
发表于 2012-12-20 22:26:12 | 显示全部楼层 |阅读模式
原子大哥,程序里 函数 为
void led_set(u8 sta)
{
LED1=sta;
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
ledset(sta);

但是说明书里,描述的为“通过在test_fun里面调用led_set 函数

所以想问下,是代码少个"_"号  还是说明书里多个"_"号 ??









学无止境
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13164
金钱
13164
注册时间
2012-11-26
在线时间
3817 小时
 楼主| 发表于 2012-12-20 22:53:01 | 显示全部楼层
另外可否解释下  
void test_fun(void(*ledset)(u8),u8 sta)
{
ledset(sta);

这个函数  特别是后面括号里的的u8
看得不是太明白  谢谢了    


学无止境
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-12-20
在线时间
0 小时
发表于 2012-12-21 00:36:07 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
void(*ledset)(u8)貌似是一个空类型的函数指针,貌似u8是定义这个函数指针的形参是char型的
我也是C才入门,不知道对不对,同求
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2012-12-20
在线时间
0 小时
发表于 2012-12-21 01:19:43 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
而且貌似没有少"_"
如果函数调用的时候实参是void test_fun(led_set(u8),1)
led_set是一个物理地址,把这个地址给了*ledset。
那么相当于:
void test_fun(led_set(u8),1)
{
(*ledset)(1);//(*ledset)相当于ledset

貌似这里这样做的目的是把那 led_set函数传进去执行,所以上面定义了一个函数指针

我素新手,不知道对不对,同求

回复 支持 反对

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13164
金钱
13164
注册时间
2012-11-26
在线时间
3817 小时
 楼主| 发表于 2012-12-21 08:02:51 | 显示全部楼层
回复【4楼】恶男:

回复【2楼】jermy_z:
---------------------------------
而且貌似没有少"_"
如果函数调用的时候实参是void test_fun(led_set(u8),1)
led_set是一个物理地址,把这个地址给了*ledset。
那么相当于:
void test_fun(led_set(u8),1)
{
(*ledset)(1);//(*ledset)相当于ledset

貌似这里这样做的目的是把那
led_set函数传进去执行,所以上面定义了一个函数指针
我素新手,不知道对不对,同求

---------------------------------
呵呵  如果沒有少“_”号   那我随便写个
void test_fun(void(*china)(u8),u8 sta)
{
china(sta);

这样编译是没有问题的,但是这个函数的意思,你能执行的了么?
学无止境
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2012-12-21 08:58:23 | 显示全部楼层
ledset 只是一个局域 传递参数  相当于 int fun(int a) 的a

而 led_set 是实际的函数 相当于调用时候 fun(x) 的 x


然后调用的时候, 这样写, test_fun(led_set ,1) ;
回复 支持 反对

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13164
金钱
13164
注册时间
2012-11-26
在线时间
3817 小时
 楼主| 发表于 2012-12-21 09:07:47 | 显示全部楼层
回复【6楼】aleda303:

ledset 只是一个局域 传递参数  相当于 int fun(int a) 的a
而 led_set 是实际的函数 相当于调用时候 fun(x) 的 x
然后调用的时候, 这样写, test_fun(led_set ,1) ;

---------------------------------
嗯,有点明白了  谢谢您的回答   那问下哦   括号里的u8是表达什么    ?
看不懂
学无止境
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2012-12-21 09:59:21 | 显示全部楼层
类型,  其实它是一个 指向函数的指针, 
中间的类型 就是你定义函数的类型, 一般保持一致就行了
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2012-12-21 10:02:50 | 显示全部楼层
举个例子  
有下面函数  int max(int a ,int b){....}

可以定义一个指针  int  ( *fun) (int , int) 

然后  可以 直接 fun = max

随后调用 fun(10,20)  ,其结果 跟 max(10,20 )一样。
回复 支持 反对

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13164
金钱
13164
注册时间
2012-11-26
在线时间
3817 小时
 楼主| 发表于 2012-12-21 10:03:58 | 显示全部楼层
回复【9楼】aleda303:

举个例子  
有下面函数  int max(int a ,int b){....}
可以定义一个指针  int  ( *fun) (int , int) 
然后  可以 直接 fun = max
随后调用 fun(10,20)  ,其结果 跟 max(10,20 )一样。

---------------------------------
明白  谢谢
学无止境
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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