打印

怎样从当前运行的函数中回到主程序呢?

[复制链接]
1146|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2014-11-4 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序运行后,执行 Open_Lock()或者 psw_change()时,只要当flag_tz=0时,怎样从当前运行的函数中回到主程序呢?程序如下:
void main()
{
while (1)
{
dis_Ds1302();
switch (getpsw())
{
case 0:
Open_Lock();
delay1(50);
break;
case 1:
psw_change();
delay1(50);
break;
case 2:
dis_again();
delay1(50);
break;
case 3:
flag_tz=0; //返回
break;
default: break;
}
}
}
沙发
liuzaiy| | 2014-11-4 12:06 | 只看该作者
“当前运行的函数”是指Open_Lock()和 psw_change()吗?

使用特权

评论回复
板凳
houcs|  楼主 | 2014-11-4 12:07 | 只看该作者
是呀,只要满足flag_tz=0时,程序就跳转回主程序,好像不能用goto。。。

使用特权

评论回复
地板
yinxiangh| | 2014-11-4 12:08 | 只看该作者
建议楼主先学习一下模块化编程的理念,而不是具体的小技巧。

使用特权

评论回复
5
pangb| | 2014-11-4 12:09 | 只看该作者
执行一个软复位指令自然就到main函数去执行了

使用特权

评论回复
6
chenjunt| | 2014-11-4 12:09 | 只看该作者
while(1)改为while(flag_tz)

使用特权

评论回复
7
ousj| | 2014-11-4 12:10 | 只看该作者
当执行完flag_tz=0时,自动就回到MAIN函数了

使用特权

评论回复
8
morrisk| | 2014-11-4 12:11 | 只看该作者
flag_tz对Open_Lock()或者 psw_change()内部是不可见的,你怎么判断
做参数送进去或者改成全局的

使用特权

评论回复
9
morrisk| | 2014-11-4 12:11 | 只看该作者
flag_tz对Open_Lock()或者 psw_change()内部是不可见的,你怎么判断
做参数送进去或者改成全局的

使用特权

评论回复
10
小小猫咪| | 2014-11-4 12:13 | 只看该作者
把flag_tz做成全局变量或者当成参数送进函数(用指针传递),然后在那两个函数体内部循环判断这个参数的值

使用特权

评论回复
11
houcs|  楼主 | 2014-11-4 12:13 | 只看该作者
我的程序其实也不是很复杂的,一个密码锁程序,就是上电后显示时钟,然后等待键盘的操作 ,并根据按键值执行相应的程序,当按下开锁键后执行Open_Lock(),按下修改密码键后执行psw_change()。。等,程序执行完后回到主程序,显示时钟。

使用特权

评论回复
12
zyf部长| | 2014-11-4 12:15 | 只看该作者
从楼主的程序和提出的要求来看,可以换一种实现方法,即直接把   dis_Ds1302(); 放到中断函数中,并想办法让 flag_tz 触发该中断即可。

使用特权

评论回复
13
houcs|  楼主 | 2014-11-4 12:15 | 只看该作者
但是,假如在执行Open_Lock()或 psw_change()中,只要按下返回键后(标志位flag_tz),就能从当前执行的程序中回到主程序,显示时钟。
     谢谢楼上各位的建议!!!

使用特权

评论回复
14
kangzj| | 2014-11-4 12:15 | 只看该作者
正在执行open_lock()或psw_change()时碰到返回键,就不继续执行下去,而是直接返回了?
不符合密码锁的要求吧

使用特权

评论回复
15
zyf部长| | 2014-11-4 12:17 | 只看该作者
如果一定硬要从当前运行的函数中回到 main,  不建议直接在函数中调用 main , 建议使用软复位,有利于模块化结构化编程。

使用特权

评论回复
16
zwll| | 2014-11-4 12:17 | 只看该作者
执行完不就返回主程序了吗?

使用特权

评论回复
17
chuxh| | 2014-11-4 12:18 | 只看该作者
open_lock()
{
…user…
if(!flag_tz) goto end;
…user…
end:;
}

或者是
open_lock()
{
while(flag_ft)
{…user…}
}都能回去。

使用特权

评论回复
18
pengf| | 2014-11-4 12:19 | 只看该作者
执行((void(*)())main)();就可以。。。不过最终会堆栈溢出

使用特权

评论回复
19
houcs|  楼主 | 2014-11-4 12:20 | 只看该作者
好吧,我再消化消化

使用特权

评论回复
20
houcs|  楼主 | 2014-11-4 12:20 | 只看该作者
多谢大家,结贴了哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝