2016-01-22 93 views
2

我正在嘗試編寫一個邏輯門電路模擬器,除了一件事情之外,一切工作都已到期。我的結構是這樣的:檢測邏輯電路模擬器中的迴路

struct node 
{ 
    int number; 
    bool has_value; 
    bool is_input; 
    bool value; 
    Gate operation; 
    node* input1; 
    node* input2; 
}; 

該程序通過使用遞歸計算產值,所以任何一種結構內部循環的打亂了一切。我的問題是:我如何檢測這樣的東西(見圖片),因爲我無法想出任何有效的東西。

circuit

+1

我在做什麼,當我需要檢測某些結構中的循環時,通過它遞歸:將附加的'std :: set'參數傳遞給遞歸函數,然後使該函數寫入唯一標識符)的項目被/處理到'std :: set',然後遞歸地傳遞它。如果您檢測到您即將處理的項目已經在一個集合中,您可以知道它已經被處理。 –

+0

事情是,你畫的電路是完全有效的。有處理這個方法,所以模擬仍然按預期運行 - http://stackoverflow.com/questions/14299603/how-to-handle-loops-in-a-digital-logic-simulator –

+0

這就是我最初的想法,但不會像這樣的東西也算作與該解決方案的循環? @AlgirdasPreidžius ![圖片](http://oi64.tinypic.com/1zn7ecl.jpg) – fardragon

回答

1

最明顯的方式來處理問題,包括在每個節點是否標誌着該節點已經在當前的模擬步驟還參觀了bool

您最初想要將其設置爲false,例如在構造函數中。

然後仿真步驟將包括遍歷圖形一次以清除標誌。當且僅當該標誌當前已設置時,纔會從給定節點執行遞歸。

然後你會運行模擬步驟。這將以大致相同的方式進行,但邏輯相反。當你訪問每個節點時,你檢查它的visited標誌。如果已設置,則可以立即返回(並且剛剛在圖中檢測到一個循環)。否則,你設置標誌,處理該節點的輸入(等等 - 你通常的模擬「東西」),然後進行遞歸調用來對其子節點進行模擬。如果它們中的任何一個循環回到這個,那個調用將立即返回(因爲你已經設置了標誌),結束遞歸調用的「腿」。

+0

工程就像一個魅力,謝謝。 – fardragon