Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
首先,我什至不知道如何解决这个问题,也不知道如何找到解决方案,因此,如果您有一个更好的标题来更好地描述我的问题,那将是很好的。
简介:我目前正在为学校的一个项目开发C代码,该项目并不是很雄心勃勃,但我想以正确的方式进行。该项目是关于硬件密码管理器的。
该项目的一部分是如果X秒钟内未收到任何输入,则设备将锁定自身的功能。我正计划通过计时器和中断来实现这一点(因为我正在研究微芯片),但这与此处的实际问题无关。
我最初的设计是,在
看到问题了吗?我将永远保存永远不会使用的局部变量(至少是PC)。我已经通过一些设计上的调整解决了这个问题。但是,问题仍然存在。
有没有一种方法可以调用一个函数而不保存我当前所在的环境?
具有功能的循环模型是一个实际的问题,还是可以通过设计一个好的模型然后加以实施来解决?如果是这样,开发人员将使用哪种解决方案?
编辑1:一个评论建议
笔记:
请将此视为草图(而不是MCVE)。由于发问者没有公开目标平台的代码或特定细节,因此我尝试“一般”地回答。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
首先,我什至不知道如何解决这个问题,也不知道如何找到解决方案,因此,如果您有一个更好的标题来更好地描述我的问题,那将是很好的。
简介:我目前正在为学校的一个项目开发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;
}
}
笔记:
请将此视为草图(而不是MCVE)。由于发问者没有公开目标平台的代码或特定细节,因此我尝试“一般”地回答。
lockScreen()
也可以使用keyInput()
。因此,可以收集密钥,直到它们形成完整的密码(可能是正确的还是错误的)为止。超时可用于重置不完整的密码。关于c - 防止依赖函数的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47916397/