找回密码
 立即注册
查看: 1084|回复: 5

C251中函数指针数组的用法

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-10 08:59:03

15

主题

30

回帖

433

积分

中级会员

积分
433
发表于 2023-3-4 22:27:04 | 显示全部楼层 |阅读模式
最近在用STC32G12K128这颗芯片,移植之前的程序发现函数指针数组中调用的函数没有被识别。多次尝试后发现在C251中函数指针数据不能在定义时初始化,需要定义后,逐个赋值。这一点和C51有点不同。

在定义时赋值无效:
  1. typedef int(* Fuc)(int, int);
  2. int add(int a, int b);
  3. int sub(int a, int b);
  4. int mul(int a, int b);
  5. int divi(int a, int b);
  6. void main()
  7. {
  8.         Fuc arr[4] = {
  9.         add,
  10.         sub,
  11.         mul,
  12.         divi
  13.         };
复制代码
编译报错误:

*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    add/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    divi/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    sub/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    mul/Demo


定义后逐个赋值:
  1. typedef int(* Fuc)(int, int);
  2. int add(int a, int b);
  3. int sub(int a, int b);
  4. int mul(int a, int b);
  5. int divi(int a, int b);
  6. void main()
  7. {
  8.         Fuc arr[4];
  9.         arr[0] = add;
  10.         arr[1] = sub;
  11.         arr[2] = mul;
  12.         arr[3] = divi;
复制代码
编译可以通过。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-01 04:31:49

24

主题

515

回帖

986

积分

荣誉版主

积分
986
发表于 2023-3-5 09:05:16 | 显示全部楼层
个人感觉 用逐个赋值的写法更直观。
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-10 08:59:03

15

主题

30

回帖

433

积分

中级会员

积分
433
发表于 2023-3-5 20:12:18 | 显示全部楼层
用法引人而异。之前在定义时赋值,是考虑到可以把函数指针放在flash里,节省ram空间。单片机有时太缺ram了。
  • 打卡等级:以坛为家I
  • 打卡总天数:246
  • 最近打卡:2025-04-30 10:10:32

3

主题

155

回帖

537

积分

高级会员

积分
537
发表于 2024-3-7 23:28:54 | 显示全部楼层
确实有这个问题这两天写程序也是这样的,之前C51不报错,移植到C251就出现了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-05-01 11:13:39

45

主题

381

回帖

1571

积分

金牌会员

静坐常思己过,闲谈莫论人非

积分
1571
发表于 2024-3-8 18:10:50 | 显示全部楼层
WARNING又不是ERROR,编译通过没啥问题吧
处事要代人所想,读书需切己用功
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2025-05-01 08:01:38
已绑定手机

1

主题

833

回帖

1441

积分

金牌会员

积分
1441
发表于 6 小时前 | 显示全部楼层
各位老师,我也遇到类似的问题,使用AI8051U试验箱编译总是出现L57警告:代码已放到附件中
Build target 'Target 1'
linking...
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    Seg_Task/io
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
    NAME:    Task_1/io
Program Size: data=8.3 edata+hdata=378 xdata=192 const=105 code=5589
creating hex file from ".\Objects\demo"...
".\Objects\demo" - 0 Error(s), 2 Warning(s).
Build Time Elapsed:  00:00:07

问题是凡是函数指针数组中调用的函数都不能被C251识别,但是实际程序运行是正常的,加REMOVEUNUSED不管用,
除了屏蔽L57警告之外,有什么办法能彻底消除这个问题,或者我的代码哪里不对?麻烦各位老师给指点一下,感谢!



demo.zip

145.77 KB, 下载次数: 0

靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 17:36 , Processed in 0.116128 second(s), 87 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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