2014-10-27 90 views
1

在我正在編寫的程序中,如果我在其開始處有一個cout << endl語句,則某個代碼塊才能正常工作。如果它不在那裏,程序不會出現段錯誤,但只是在100%的時間內給出可驗證的錯誤答案。隨着cout << endl聲明,它每次都有效。我實際上不知道是什麼導致這種情況,因爲我試過用cout.flush()來刷新cout緩衝區,但它沒有效果。此外,如果沒有endl,則無法使用cout。我也進行了double檢查,並且Node結構的所有成員變量都已在結構的初始化程序列表中初始化。如果有人能幫助我,我會非常感激!這是有問題的代碼片段:添加endl修補程序代碼

` bool Board::CheckDistinct(Node* node, int* rec) { 
     cout << endl; // if I comment this line out, it doesn't work correctly 
     if(node->incoming.size() > 1) { 
     Node* rec_node = node->incoming[rand() % node->incoming.size()]; 
     *rec = rec_node->row * num_cols() + rec_node->col; 
     return false; 
     } 
     else if(node->incoming.size() == 0) return true; 
     else { 
     node->visited = true; 
     if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec); 
     } 
    } 

下面是Node結構的代碼(如果有幫助):

struct Node { 
     int val, row, col, dist; 
     bool visited, is_white_hole, is_black_hole; 
     Node* outgoing[4]; 
     std::vector<Node*> incoming; 
     Node(int val_, int row_, int col_) : 
     val(val_), row(row_), col(col_), dist(-1), 
     visited(false), 
     is_white_hole(true), is_black_hole(true) { } 
    }; 
+0

您使用的是圖書館嗎? – Etixpp 2014-10-27 08:29:03

+0

您的預期產出是什麼,實際情況如何?你在哪裏以及如何產生所述輸出? 「它給出了錯誤的答案」沒有幫助。 – BeyelerStudios 2014-10-27 08:30:05

+0

你可以給上下文調用函數嗎? – H4kor 2014-10-27 08:40:33

回答

0

好,我終於找到了。錯誤是在return語句:

if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

我沒有一個else語句,如果這是不正確的,會回來,所以我想發生在這一點上不確定的行爲。我仍然不知道爲什麼cout << endl解決了這個問題,但我想這就是它。

3

我懷疑,問題是你沒有返回自己內心的結果:

if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec); 

應該是:

if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec); 
            ^^^^^^ 

調用cout可能只是以某種方式更改代碼生成(例如,編譯器可能決定實際遞歸而不是將尾遞歸轉換爲循環,或者以某種方式使用不同的寄存器,或者使用其他長列表的東西。

(應注意的是,我已經看到了這個錯誤很多次,並取得了幾次,我自己......這是不尋常了!)

+0

啊我不敢相信我錯過了!不幸的是,我並不確定如何,在我修正之後仍然取決於cout聲明。 – amohan95 2014-10-27 09:11:04

+0

然後我會開始調試 - 在各種情況下逐步執行代碼,在最後打印輸入和結果。 – 2014-10-27 09:13:18

+0

或者,發佈一些完整的代碼,以便有人在這裏可以試用。這很可能是其他地方發生的錯誤(你可能需要將代碼分解爲更小的測試程序,因爲這裏不太可能有人會調試大量的代碼)。還啓用了'-Wall -Wextra -Werror'(或者它是等同的)並修復它拋出的任何警告。 – 2014-10-27 09:14:51