【发布时间】:2020-06-14 15:02:29
【问题描述】:
这里是初学者。对于工程学校,我正在学习如何用 C 编程。我的任务之一是设计一个有限状态机。因为我是一名吉他手,所以我想我用 C 语言做了一个吉他踏板模拟。 使用 switch case 语句,我已经到了可以在模拟中调整控件的地步。这个(假)踏板有 3 个旋钮(电平、音调、驱动),每个旋钮有 3 个位置(低、中、高)和一个脚踏开关,用于使踏板起作用。
为了增加趣味性,我想创建一个“随机”预设发生器,它应该在“现实世界”中像这样工作:你按下一个按钮,踏板就会产生一个信号输出,例如。电平高,音中,驱动低。可以这么说,按下按钮时有 3^3 种可能的结果。
如何在 C 中创建它?我可以想象我必须创建一个包含这些结果的表格并创建一个随机函数来使其工作。但这就是方式吗?
[编辑] 感谢 cmets 和一些进一步的挖掘,我开始明白我最初的想法对于 FSM 来说并不是一个很好的例子。然而,为了练习的目的,这真的无关紧要。学习过程的一部分是犯错误。在作业的反思部分,我将向导师解释这一点。我在 UML 中创建了状态图以进行澄清。 state chart
原始问题仍然存在:如何在 C 中创建随机预设生成器?
【问题讨论】:
-
对我来说,解决方案不是通过状态机,因为按钮没有定义整体“状态”。你在一个有多个变量的公式前面
-
如果你真的想要一个状态机,你只有 2 个状态,具体取决于脚踏开关,依此类推(如果我很了解它是如何工作的)。另请注意,状态机的主要功能不是结果,而是收入(例如,产生转换的事件和守卫)
-
补充@bruno 所说的,状态机是关于符号序列的。如果符号的顺序无关紧要(您只关心 哪个 符号当前处于活动状态,而不关心先发送哪个符号,也不关心 20 个符号前发送了哪个符号),那么状态机什么也不做给你。
-
@MrGreenery 你可以说你想说的任何话,你也可以在里面塞入一个状态机,但这对你没有帮助,也没有简化或澄清问题。这是多余的,只会使您的方法复杂化。您有一些状态(开关的当前位置),并在当前信号上应用相应的转换。除非转换应该依赖于先前设置的开关的历史,否则状态机绝对不会为您做任何事情(即使如果您想要类似衰减的东西,您可能应该使用适当的过滤器来代替)。
-
欢迎来到 SO。请花时间阅读stackoverflow.com/help/mcve 并编辑您的问题。