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 编程初始化指针函数数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

Keil 单片机C语言编译软件的使用(涉及指针数组)

关于keil编译器下指针指向数组警告的问题?

Windows 中的多线程 - 创建函数指针数组时出错

在函数中使用向量指针时出错

C - 尝试将指向函数的指针作为参数传递时出错,无法获取值

嵌入式编程中,如何使用复杂指针?