gpt4 book ai didi

c - 如何保存状态并返回到深度 C 函数?

转载 作者:太空狗 更新时间:2023-10-29 17:13:17 27 4
gpt4 key购买 nike

背景

我正在移植现有的 C 程序,以使用 Emscripten 作为在线游戏。

问题是 Emscripten 希望围绕一个每秒调用 60 次的函数来组织程序。这对于主游戏循环来说是可以的,除了有相当多的地方代码显示一组选项然后等待按下一个键来选择选项。这表示为调用层次结构深处的函数,使用 getch() 等待按键。我发现很难看出如何将其融入运行然后完成的函数所需的 Emscripten 风格。

问题

当代码调用了一个函数,调用了一个函数,调用了一个函数,有没有一种简单的方法来保存调用堆栈的整个状态,以便我以后可以返回到同一个地方?

我尝试过的

  1. 我目前使用的方法是设置一个全局状态变量来指示我当前的位置,并将堆栈上所有看起来重要的东西写入静态变量。然后我从所有功能中返回。为了重新进入,我使用全局变量来决定调用哪个函数以及从保存的数据中重新加载哪些变量。然而,这涉及编写大量额外的代码并且非常容易出错。

  2. 我想知道如何为游戏逻辑使用一个线程并从 GUI 线程发送消息,但是当前的 thread API在 Emscripten 内部似乎要求我尝试将所有游戏数据复制到一条消息中,所以这感觉就像做更多的工作却收效甚微。

  3. Emscripten 支持 setjmp/longjmp,但据我所知,这只完成了一半的工作。我认为我可以使用 longjmp 简单地从深层函数返回到上层,但无论如何我都看不到我可以使用它稍后返回到原来的位置。

关于如何做到这一点有更好的想法吗?

最佳答案

您不能从调用堆栈返回并再次重新输入它。你只能进行更深层次的调用,仍然能够返回到当前状态。函数返回后,相同的堆栈(相同的物理内存位置)将重新用于以下调用,并且值会被覆盖。

我不知道 Emscripten; getch() 包装器可以递归地驱动循环直到按下一个键吗?

setjmp/longjmp 保存堆栈偏移量,但不保存堆栈上的值。它只对从堆栈中弹出多个帧有用;它是最接近抛出异常的 C。

关于c - 如何保存状态并返回到深度 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com