硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1954|回复: 14
收起左侧

[有问必答] C51单片机是否不支持函数指针数组?

  [复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-11-4 17:04:08 | 显示全部楼层 |阅读模式
主要代码如下:
  1. typedef struct
  2. {
  3.         unsigned char fla;
  4.         void (*f)(unsigned char);
  5. }relay_t;
复制代码
构造一个结构体,内含一个函数指针;

  1. relay_t relay_sz[Relay_Num];
  2. void (*f[Relay_Num])(unsigned char)={Relay_1,Relay_2,Relay_3,Relay_4,Relay_5,Relay_6,Relay_7,Relay_8} ;
复制代码
定义了一个函数指针数组,Relay_x已在其它地方正确定义。

  1. void (*fe)(unsigned char)=NULL;
复制代码
定义了一个测试用的函数指针
  1. relay_sz[0].f=Relay_1;
  2.        
  3.         relay_sz[0].f=f[0];
  4.        
  5.         fe=Relay_1;
  6.        
  7.         fe=f[0];
复制代码
使用四种赋值方式
  1. fe(0);
  2. relay_sz[0].f(0);
复制代码
使用两种方式进行测试
结果:
  1. relay_sz[0].f=Relay_1;
  2. relay_sz[0].f();
复制代码
可以正常执行
  1. relay_sz[0].f=f[0];
  2. relay_sz[0].f();
复制代码
不能正常执行
  1. fe=Relay_1;
  2. fe();
复制代码
可以正常执行
  1. fe=f[0];
  2. fe();
复制代码
不能正常执行


请问这是为什么呢?
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-11-4 17:05:35 | 显示全部楼层
  1. #include <stdio.h>
  2. #define  FP_LEN 3
  3. typedef struct
  4. {
  5.     void(*f)(unsigned char);
  6. }fp_test_t;
  7. fp_test_t fp_t[FP_LEN];
  8. void add(unsigned char );
  9. void dec(unsigned char);
  10. void (*f[FP_LEN])(unsigned char )={add,dec,NULL};

  11. void main(void)
  12. {
  13.     char boo=0;
  14.     for(boo=0;boo<FP_LEN;boo++)
  15.     {
  16.         fp_t[boo].f=f[boo];
  17.     }
  18.     for(boo=0;boo<FP_LEN;boo++)
  19.     {
  20.         if(fp_t[boo].f!=NULL)
  21.         fp_t[boo].f(0);
  22.     }
  23. }
  24. void add(unsigned char x)
  25. {
  26.     printf("this is add function\r\n");
  27. }
  28. void dec(unsigned char x)
  29. {
  30.     printf("this is dec function\r\n");
  31. }
复制代码

在vsc写了一个测试用的代码,是能正常运行的。
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-11-4 17:20:43 | 显示全部楼层
当然支持。。。。。。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2021-11-4 18:01:10 | 显示全部楼层
没错,C51不支持函数指针
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2021-11-4 22:33:09 | 显示全部楼层
支不支持和单片机没关系,和编译器有关系。
回复

使用道具 举报

1

主题

369

回帖

372

积分

高级会员

积分
372
发表于 2021-11-5 01:19:45 | 显示全部楼层
可能51不能嵌套太多,压不进去
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2021-11-5 08:28:59 | 显示全部楼层
挖东衣宇 发表于 2021-11-5 01:19
可能51不能嵌套太多,压不进去

压不进去指的是?这个类似赋值操作会涉及到栈吗?另外,编译的容量选项选的是最大的。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2021-11-8 19:45:55 | 显示全部楼层
支持。请看MDK的帮助文档,搜索function pointer,里面有具体的例子。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2021-11-9 09:14:01 | 显示全部楼层
51内核单片机,data区128字节,idata区128字节,这么小的内存,容不下太大的栈,这是51内核天生的设计缺陷,给51编程就别用太复杂的语法了,51的问题可以加我的小QQ群:725436073
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-11-9 14:16:11 | 显示全部楼层
taobaofarmer 发表于 2021-11-9 09:14
51内核单片机,data区128字节,idata区128字节,这么小的内存,容不下太大的栈,这是51内核天生的设计缺陷 ...

外扩RAM就可以。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2021-11-11 09:36:39 | 显示全部楼层
给51外扩一个SRAM,成本上还不如上一个ARM
回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
发表于 2021-11-11 13:05:35 | 显示全部楼层

“廉颇老矣”, 尚能饭否。
能凑合就凑合。 不行就换新!
与时俱进, 何必在一颗老树上吊死!
G0 不香吗?ESP8266 ,ESP32  不香吗? 大把好用 便宜的芯片有的是!
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-11-13 09:45:52 | 显示全部楼层
taobaofarmer 发表于 2021-11-11 09:36
给51外扩一个SRAM,成本上还不如上一个ARM

确实。做太复杂的控制,51没啥优势了。简单还可以。
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2021-11-13 09:47:53 | 显示全部楼层
Hp_2018 发表于 2021-11-11 13:05
“廉颇老矣”, 尚能饭否。
能凑合就凑合。 不行就换新!
与时俱进, 何必在一颗老树上吊死!

1,旧产品。
2,习惯。
3,小封装51还是便宜。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2021-11-13 18:19:54 | 显示全部楼层
说啥没用,还是价格因素让51还有生命空间,否则逐步的早淘汰了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 06:25 , Processed in 0.284795 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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