keil C 编程初始化指针函数数组时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keil C 编程初始化指针函数数组时出错相关的知识,希望对你有一定的参考价值。
、*结构类型*/
typedef struct
void (*keySetting)();
void (*display)();
SettingStruct;
SettingStruct advanceModeFun[] =
advMode1SetAdj, advMode1Disp,
advMode2SetSenorSlect,advMode2Disp,
;
void (* advModeSetting[])(void) =
advanceModeFun[0].keySetting,/* 这行编译时提示错误, error C247: non-address/-constant initializer*/
;
如果用 advMode1SetAdj, 则正确,但我想用上面的调用指针函数结构数组成员的方法
如果用&advanceModeFun[0].keySetting,编译没有错误但运行时出错
第一个回答正确的加100分,后面回答正确的加20分,但核心内容相同或基本相同答案的除外。
应为 “初始化函数指针数组时出错”
/*补充四个函数*/
void advMode1SetAdj(void)
void advMode2SetSenorSlect()
void advMode1Disp()
void advMode2Disp()
/*补充主函数*/
main()
advModeSetting[0]();
while(1);
两个数组advanceModeFun,advModeSetting都是为常量const类型的。
研究了一下这个问题。Keil报non-address/-constant initializer是正确的,因为advanceModeFun和advModeSetting是在同一级别初始化的,此时后者不可能知道前者的真实地址。
所以你的这个问题,暂时来看有两种解决方法:
其一,就是像你所说的,用地址确定的函数声明(例如advMode1SetAdj)来赋给advModeSetting的元素。当然这种方法你是不喜欢的。
其二,就是在运行时将advanceModeFun的元素赋给advModeSetting,达到你的需求。例如:
void (* advModeSetting[])(void) =//advanceModeFun[0].KeySetting,
advMode1SetAdj,
advMode2SetAdj,
;
void main()
advModeSetting[0]();
advanceModeFun[1].Display();
advModeSetting[0] = advanceModeFun[1].KeySetting;
advModeSetting[0]();
while(1);
这段例程中,第一个advModeSetting[0]()实际调用advMode1SetAdj(),第二个advModeSetting[0]()实际调用advMode2SetAdj()。
追问非常感谢你的回答,什么是同一级别初始化?试了下把advModeSetting定义为局部变量也不行。
可能是编译器只支持用常量初始化变量,而我试图用结构数组元素来初始化指针数组元素。两个数组都是为常量const类型的。
这涉及到编译过程的前后顺序。建议你找本编译原理的书简单看看。
参考技术A 发给我看看追问补充上面五个函数。
追答丘上说吧
uVision Keil STM32调试“***错误57:非法地址(0x08000000)”时出错
【中文标题】uVision Keil STM32调试“***错误57:非法地址(0x08000000)”时出错【英文标题】:uVision Keil STM32 Error on debuging "*** error 57: illegal address (0x08000000)" 【发布时间】:2019-07-08 07:58:18 【问题描述】:我写了一个简单的代码,只是为STM32F103RBT6设置时钟和初始条件,并通过ULINK2成功地在我的板上编程。
但是当我要进入调试模式时,我看到了这个错误:
*** error 57: illegal address (0x08000000)
另外,我不能在我的程序上设置断点,但是反汇编部分可以工作一段时间,然后陷入循环。
请注意,我有许多其他程序在我的板上成功编程并通过此 ULINK2 进行调试,但这个简单的程序占用了我所有的时间!
我的设置有一些图片:
调试模式
这是我的简单程序
目标设定
调试设置
【问题讨论】:
我以各种方式尝试所有调试设置,即使我使用 CUBEMX 再次创建项目。甚至在 JTAG 和 SWD 上都对其进行测试,但没有成功。我挂了! 【参考方案1】:在Debug -> Settings -> Debug中,确保“Download to Flash”被取消勾选。
显然,无论如何默认情况下都应该禁用它。它旨在用于从 RAM 运行的代码。
【讨论】:
【参考方案2】:我只是用 JLINK V9.3 更改了我的 ULINK 调试器,然后所有具有相同设置的东西都运行良好
【讨论】:
以上是关于keil C 编程初始化指针函数数组时出错的主要内容,如果未能解决你的问题,请参考以下文章