找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 3796|回复: 7
收起左侧

51单片机编程使用函数指针 Keil报错parameters do not fit within registers

[复制链接]
ID:217889 发表于 2023-6-25 22:40 | 显示全部楼层 |阅读模式
  1. // 定义函数指针
  2. typedef (*Calculator) (int num1, int num2);

  3. // 加法
  4. static int AddOption(int num1, int num2)
  5. {
  6.     return num1 + num2;
  7. }

  8. // 减法
  9. static int SubOption(int num1, int num2)
  10. {
  11.     return num1 - num2;
  12. }

  13. // 乘法
  14. static int MulOption(int num1, int num2)
  15. {
  16.     return num1 * num2;
  17. }

  18. // 除法
  19. static int DivOption(int num1, int num2) {
  20.     return num1 / num2;
  21. }

  22. int CalNum(int opt, int num1, int num2)
  23. {
  24.     // 函数指针数组
  25.     Calculator optFunc[] = {
  26.         AddOption,
  27.         SubOption,
  28.         MulOption,
  29.         DivOption
  30.     };

  31.     return optFunc[opt](num1, num2);
  32. }
复制代码

以上代码会在 return optFunc[opt](num1, num2); 语句这里报下面的告警
error C212: indirect call: parameters do not fit within registers

百度了一下了解到51的函数指针跟标准C有差别  需要加code关键字 但是看不懂怎么加

有大佬可以指教一下吗 感谢
回复

举报

ID:908826 发表于 2023-6-26 08:03 | 显示全部楼层
回复

举报

ID:1080935 发表于 2023-6-26 08:23 | 显示全部楼层
测试没问题,是不是调用问题,看看怎么调用的。
回复

举报

ID:526108 发表于 2023-6-26 09:35 | 显示全部楼层
直接声明
code int(code*Calculator[]) (int, int)={
AddOption,
SubOption,
MulOption,
DivOption
};
return Calculator[opt](num1,num2);
回复

举报

ID:77589 发表于 2023-6-26 14:09 | 显示全部楼层
你定义函数指针
typedef (*Calculator) (int num1, int num2);没有返回类型
你定义的函数实体又有返回类型
回复

举报

ID:217889 发表于 2023-6-26 22:57 | 显示全部楼层
LaoYuTou 发表于 2023-6-26 08:23
测试没问题,是不是调用问题,看看怎么调用的。

上面只是给了简单的框架 实际代码对类型做了重定义
typedef unsigned int uint16_t
typedef unsigned long uint32_t

实际测试中发现定义函数指针时变量类型使用uint16_t不会报这个错 但是用uint32_t时会报错
不清楚原因在哪里
回复

举报

ID:217889 发表于 2023-6-26 23:05 | 显示全部楼层
测试发现在定义函数指针时若使用了long类型的变量就会报错
是否跟51的函数指针的参数列表限制有关

uint32_t报错

uint32_t报错

uint16_不报错

uint16_不报错
回复

举报

ID:217889 发表于 2023-6-26 23:06 | 显示全部楼层
Longan.Wang 发表于 2023-6-26 14:09
你定义函数指针
typedef (*Calculator) (int num1, int num2);没有返回类型
你定义的函数实体又有返回类 ...

不好意思 这里手打的代码漏掉了 实际代码中是有的
回复

举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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