C++ 逻辑电路模拟器中的环路检测

C++ 逻辑电路模拟器中的环路检测,c++,pointers,C++,Pointers,我正在尝试写一个逻辑门电路模拟器,到目前为止,除了一件事,所有的东西都在工作。我的结构如下所示: struct node { int number; bool has_value; bool is_input; bool value; Gate operation; node* input1; node* input2; }; 程序使用递归计算输出值,因此结构中的任何类型的循环都会把一切搞糟。我的问题是:我如何检测到这样的东西(见图),因

我正在尝试写一个逻辑门电路模拟器,到目前为止,除了一件事,所有的东西都在工作。我的结构如下所示:

struct node
{
    int number;
    bool has_value;
    bool is_input;
    bool value;
    Gate operation;
    node* input1;
    node* input2;
};
程序使用递归计算输出值,因此结构中的任何类型的循环都会把一切搞糟。我的问题是:我如何检测到这样的东西(见图),因为我想不出任何有效的方法


处理该问题的明显方法是在每个节点中包含一个
bool
,表示在当前模拟步骤中是否已访问该节点

最初,您可能希望将其设置为
false
,例如在构造函数中

然后,模拟步骤将包括遍历图形一次以清除标志。当且仅当当前设置了标志时,才会从给定节点执行递归


然后运行模拟步骤。这将以大致相同的方式进行,但逻辑相反。访问每个节点时,检查其
已访问
标志。如果设置了,您可以立即返回(并且您刚刚在图形中检测到一个循环)。否则,您将设置标志,处理该节点的输入(等等——通常的模拟“东西”),然后执行递归调用,在其子节点上进行模拟。如果其中任何一个循环回到这个循环,该调用将立即返回(因为您已经设置了标志),结束递归调用的“分支”。

当我需要检测某个结构中的循环时,在递归过程中我正在做的事情:将附加的
std::set
参数传递给递归函数,然后,让该函数写下处理到所述
std::set
的项目的唯一标识符(可以是任何东西),然后递归地向下传递。如果你检测到你要处理的项目已经在一个集合中,你就可以知道它已经被处理过了。问题是,你画的电路是完全有效的。有一些方法可以处理这一点,因此模拟仍按预期运行——这是我最初的想法,但这样的事情不也算是解决方案的循环吗@阿尔及达斯佩雷斯@我对逻辑电路不是很熟悉,所以我不能肯定地回答这个问题。我能说什么-这完全取决于你如何选择遍历一个图,以及你是否选择通过,比如说
std::set
,绕过,作为参考,还是作为一个值。@AndrewWilliamson这很有趣。如果我想了解更多关于这种电路的信息,你知道我应该寻找什么吗?无论如何,我有一种感觉,要实现这一点,我必须修改很多代码。我可能会考虑在某一天做这件事,但现在简单地检测这样的循环就足够了。