请教多级菜单中的函数指针问题
#define u8 unsigned charvoid (*KeyFuncPtr)(); //按键功能指针
typedef struct{
u8 KeyStateIndex; //当前状态索引号
u8 KeyEnterState; //按下"确认"键时转向的状态索引号
u8 KeyExitState; //按下"返回"键时转向的状态索引号
u8 KeyUpState;//按下"向上"键时转向的状态索引号
u8 KeyDownState;//按下"向下"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
}KbdTabStruct;
KbdTabStruct volatile const code KeyTab[]={
// |-----------> Index
// |Enter
// ||Exit
// |||Up
// ||||Down --->功能函数
// ||||| |
{ 0, 1, 2, 3, 4,(*DispMenuInit)}, // 图标层菜单:第一级菜单
{ 1, 0, 0, 0, 0,(*DispMenuEnter)},
{ 2, 0, 0, 0, 0,(*DispMenuExit)},
{ 3, 0, 0, 0, 0,(*DispMenuUp)},
{ 4, 0, 0, 0, 0,(*DispMenuDown)},
.......
........
{ 200, 201, 202, 203, 204,(*DispMenuInit)}, // :第四级菜单
{ 201, 0, 0, 0, 0, (*DispMenuEnter)},
{ 202, 0, 0, 0, 0,(*DispMenuExit)},
{ 203, 0, 0, 0, 0,(*DispMenuUp)},
{ 204, 0, 0, 0, 0,(*DispMenuDown)},
};
请问当 KeyStateIndex >= 100后编译后程序就跑飞了,好像堆栈溢出了,是不是当索引号大时,函数指针到不了指定的函数了,比如当 KeyStateIndex =200时,要执行对应的函数:void DispMenuInit(void),就溢出了,这种现象是什么原因呢?麻烦各位指教,谢谢! 不懂 应该不会存在这样的问题
你的菜单是怎么嵌套的? 你的“......”是不是真的有5到199?数组必须要有205个,否则有误 是的,从0到204
我是引用本站中的那个"一个占用内存最少的菜单“中的例子
main中调用菜单按键程序
void main(void)
{
while(1)
{
MenuCheckKey();
}
}
//-------------------------//
void MenuCheckKey(void)
{
u8 key = 0;
key = KeyScan();
switch(key)
{
case Key_Enter:{ //确认键,找出新的菜单状态编号
KeyFuncIndex=KeyTab.KeyEnterState;
KeyFuncPtr=KeyTab.CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
}
case Key_Exit:{ //退出键,找出新的菜单状态编号
KeyFuncIndex=KeyTab.KeyExitState;
KeyFuncPtr=KeyTab.CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
}
case Key_Up:{ //向上键,找出新的菜单状态编号
KeyFuncIndex=KeyTab.KeyUpState;
KeyFuncPtr=KeyTab.CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
}
case Key_Down:{ //向下键,找出新的菜单状态编号
KeyFuncIndex=KeyTab.KeyDownState;
KeyFuncPtr=KeyTab.CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
}
//---------------------------------------------------------------------------
default: //按键错误的处理
break;
}
if(Flash)
{
KeyFuncPtr = KeyTab.CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
Flash = 0;
}
} 内存不够的表现 mark 慢慢学习 感觉楼主搞得有点复杂了,可以考虑用函数指针数组来简化模型。 太复杂,看不懂!!!!!我也在找菜单函数,但是有很多都看不懂,特别是里面的那些数值,不知道是根据什么来计算的,要是有个比较详细的例程就好了!!!!!!!!!!!!! 回复【8楼】hpdell
-----------------------------------------------------------------------
那些数值就是按下对应按键后要跳转的目标KeyStateIndex。 回复【7楼】mynameis
-----------------------------------------------------------------------
其实这个应该就算是比较简单的了,KbdTabStruct volatile const code KeyTab …… 就是已经初始化了菜单关系及函数指针。 静下心看1 2天就不觉得难了! m 最近也为菜单在烦 这个是Keil C51编译器的限制,Keil C51对于函数指针是不完全支持的。
欲知详情,请参阅: http://www.keil.com/appnotes/docs/apnt_129.asp
当初我也是在C51中采用了函数指针,导致了某些非常诡异的现象,找了好久才发现这个限制的,希望能有所帮助。 有时间看看我也看看怎么弄。。。。 不懂啊 mark 正在研究中………… 想问一下,这个数据结构中,执行函数怎么对具体数据进行修改呢,按一下ENTER按鍵马上就返回了
页:
[1]