68336016 发表于 2013-8-22 10:44:06

问个C语言基础问题,这2个菜单函数怎么能多次嵌套调用?

本帖最后由 68336016 于 2013-8-22 10:52 编辑

要在LCD里面写个菜单,于是参照论坛上的一个程序。
下面2个函数看起来挺简单的,就是按OK后从一级菜单跳到二级菜单,按ESC后又从二级菜单返回到一级菜单。
但是像这样,两个函数不是多次相互反复包含了么?void One_Menu()                   //一级菜单
{
      LCD_ClearDisplay();                  /* 清屏 */                  
      while( 1 )
      {
            if( Key == OK ) {Key = 0;Two_Menu();}
            else ;
      }      
}
                        
void Two_Menu()                         //二级菜单
{
    LCD_ClearDisplay();                     /* 清屏 */      
    while( 1 )
          {
                  if( Key == ESC ) { Key = 0;One_Menu(); }
                  else ;
          }
}修改了下标题

albert_w 发表于 2013-8-22 10:48:52

我滴个天,菜单都搞出来了, 还没搞明白C的机制...
在这个文件的头文件里面放两行:
void One_Menu(void);
void Two_Menu(void);
如果连头文件都没有, 那就把这两行放在文件头部. 它告诉编译器, 存在有这么两个函数.

这代码看着好难受...
            if( Key == OK ) {Key = 0;Two_Menu();}
            else ;

68336016 发表于 2013-8-22 10:51:43

本帖最后由 68336016 于 2013-8-22 10:55 编辑

albert_w 发表于 2013-8-22 10:48 static/image/common/back.gif
我滴个天,菜单都搞出来了, 还没搞明白C的机制...
在这个文件的头文件里面放两行:
void One_Menu(void);


你可能没明白我的意思,不是文件包含那概念。

而是这两个函数A调用B,B再调用A,然后再A调用B,就这样反复相互嵌套

按照我的理解 一级菜单函数->二级菜单函数->三级菜单函数这样一个调用顺序,要返回一级菜单函数得层层跳出才行,但是那网友的代码却能在下级菜单函数直接调用一级菜单函数就返回了

albert_w 发表于 2013-8-22 11:09:09

68336016 发表于 2013-8-22 10:51 static/image/common/back.gif
你可能没明白我的意思,不是文件包含那概念。

而是这两个函数A调用B,B再调用A,然后再A调用B,就这样反 ...

o, 明白你的意思了. 按说来该返回回来的, 不然这个调用栈比较深了. 但返回的话需要一个额外的过程来处理一些事情, 相当于要把状态和操作分离了.

takashiki 发表于 2013-8-22 11:17:18

请使用状态机,将每一个函数的嵌套深度一致。
你这样是递归,多次调用后RAM会受不了溢出。而且,一旦您的一个菜单被按下了,就阻塞了其他函数的执行过程,您真的希望这样?
是谁教你把菜单执行函数写成任务的?那个参考程序赶紧扔掉!
页: [1]
查看完整版本: 问个C语言基础问题,这2个菜单函数怎么能多次嵌套调用?