关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
4年前关闭。
Improve this question
首先,我什至不知道如何解决这个问题,也不知道如何在谷歌上找到解决方案,所以如果你有一个更好的标题来更好地描述我的问题,那就太好了。
简介:我目前正在为学校的一个项目开发 C 代码,该项目并不是很雄心勃勃,但我希望以正确的方式进行。该项目是关于硬件密码管理器的。
该项目的其中一个部分是如果在 X 秒内没有收到任何输入,设备会自行锁定。我计划通过计时器和中断来实现这一点(因为我正在研究微芯片)但这与这里的真正问题无关。
我最初的设计是在 main()
函数调用函数lock()
因此设备启动锁定,一旦提供正确的 PIN,功能 MainMenu()
被调用(在 lock()
范围内)。但是,MainMenu()
有一个 while(1) { some code }
它永远不会返回任何东西,因为它不需要。但是,下次用户AFK时,会触发中断,lock()
将被调用,有效地保存 MainMenu()
的程序计数器.一旦用户输入正确的 PIN,lock()
将调用 MainMenu()
.换句话说,函数 A
将调用函数B
这将再次调用 A
等等。
看到问题了吗?我将永远保存永远不会使用的局部变量(至少是 PC)。我已经通过设计中的一些调整解决了这个问题。但是,问题仍然存在。
编辑1:建议一条评论
break
.这不是我想要的,因为问题不在循环内部,而是在两个相互调用的函数中。另一条评论建议setjmp()
和 longjmp()
.如果您想保存当前运行的环境,我认为此功能很有用。但是,就我而言,恰恰相反,我这样做 不是 想拯救我所在的环境。
最佳答案
状态机听起来不错而且很复杂。下面的设计稍微简单一些。我会这样做:
/* locks screen
*
* Function does not return until valid keys for unlock have been entered.
*/
void lockScreen();
/* prints menu (may consider choice to highlight resp. item)
*/
void printMenu(int choice);
/* reads from keyboard
*
* returns: < 0 ... timeout
* >= 0 ... selected menu item
*/
int keyInput();
/* main function */
int main()
{
int lastChoice = -1;
for (bool lock = 1;;) { /* never ending run-time loop */
if (lock) { lockScreen(); lock = 0; }
printMenu(lastChoice);
int choice = keyInput();
switch (choice) {
/* regular choices */
/* exit required?
case 0: return 0;
*/
case 1: /* do 1st command */ break;
case 2: /* do 2nd command */ break;
default: /* should not happen */ break;
/* timeout */
case -1: lock = 1;
}
if (choice >= 0) lastChoice = choice;
}
}
备注:
lockScreen()
可以使用 keyInput()
也是。因此,可以收集 key ,直到它们形成完整的密码(可能正确或错误)。超时可用于重置不完整的密码。 关于c - 防止相关函数中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916397/