标题: 51单片机编程使用函数指针 Keil报错parameters do not fit within registers [打印本页]

作者: 三分情话    时间: 2023-6-25 22:40
标题: 51单片机编程使用函数指针 Keil报错parameters do not fit within registers
  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关键字 但是看不懂怎么加

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

作者: 13205495918    时间: 2023-6-26 08:03
https://www.cnblogs.com/jqdy/p/14476285.html,参考一下这个看看
作者: LaoYuTou    时间: 2023-6-26 08:23
测试没问题,是不是调用问题,看看怎么调用的。
作者: 624353765    时间: 2023-6-26 09:35
直接声明
code int(code*Calculator[]) (int, int)={
AddOption,
SubOption,
MulOption,
DivOption
};
return Calculator[opt](num1,num2);
作者: Longan.Wang    时间: 2023-6-26 14:09
你定义函数指针
typedef (*Calculator) (int num1, int num2);没有返回类型
你定义的函数实体又有返回类型
作者: 三分情话    时间: 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时会报错
不清楚原因在哪里
作者: 三分情话    时间: 2023-6-26 23:05
测试发现在定义函数指针时若使用了long类型的变量就会报错
是否跟51的函数指针的参数列表限制有关

Err.png (29.68 KB, 下载次数: 33)

uint32_t报错

uint32_t报错

OK.png (29.84 KB, 下载次数: 41)

uint16_不报错

uint16_不报错

作者: 三分情话    时间: 2023-6-26 23:06
Longan.Wang 发表于 2023-6-26 14:09
你定义函数指针
typedef (*Calculator) (int num1, int num2);没有返回类型
你定义的函数实体又有返回类 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1