2014-07-26 115 views
0

在以下代碼中,cout語句(有時)會重複,而不退出if語句,並且不會在j ++中增加j。有時候循環的工作方式和預期的一樣(j ++對每個cout增加一次,語句退出)。我看過這個(看起來......),並不知道我做錯了什麼。有任何想法嗎?循環無故重複?

void SlipHash::outputHashTable() { 
     ios_base::fmtflags fmtflg = cout.flags(); 
     const int size = min(nEntries, tableSize); 
     for (int i = 0, j = 0; j < size; i++) { 
     if (hashTable[i]) { 
      j++; 
      cout << left << setw(27) << "SlipHash::outputHashTable[" << dec << i << "] " 
       << hex << hashTable[i] << endl; 
     } 
     } 
     cout.flags(fmtflg); 
    }; // void SlipHash::outputHashTable() 
+1

行爲不依賴於哈希表的內容嗎?如果它包含零,則不會打印,也不會增加'j'。代碼中'j'的功能是什麼? – Floris

+1

當hashTable [i]爲false時,存在一條路徑,它不會增加'j'。這就是說,使用operator []重載這個可以解決幾乎任何事情。提供最少的代碼。 –

+2

你怎麼知道它沒有遞增'j'打印?你能夠在調試器中重複該問題嗎? –

回答

0

當你在if語句中輸入時,你不能沒有增加j var的cout。你確定nEntries和tableSize和正確的值嗎?如果沒有,你可以在內存使用值超出哈希表[size_table]字段的值是否爲出衆,甚至可以創建無限循環,如果遜色,因爲Ĵ永遠達不到大小 VAR

+0

問題是如果hashTable [i]!= NULL,那麼代碼會增加j次並且多次執行cout,然後代碼檢查下一個表項。只要執行檢查終止並且表中有nEntries,循環就不能是無限的。 –

2
for (int i = 0, j = 0; j < size; i++) { 

看來你已經輸錯;;

for (int i = 0, j = 0; j < size; j++) { 
//        ^

for (int i = 0, j = 0; i < size; i++) { 
//     ^

將是正確的。

+0

您的更正將無法使用。通常,哈希表中條目的數量j比表格的大小要小得多。每當我看到一個條目時就會增加j,並在所有條目都用完時退出表格。在你的解決方案中,我會提前退出。如果表大小= 1024且表項= 3,則在第三個散列表位置之後,而不是散列表項,即使沒有看到任何條目,我也會存在。 –

+0

@ArthurSchwarez哦,我沒有仔細閱讀你的代碼。然後,我認爲'tableSize'有一個bug。你有沒有試過調試? – ikh

+0

我不明白。 tableSize唯一的函數是爲nEntries設置最大值。錯誤的循環是圍繞cout語句的,它沒有環繞它的循環。我只是感到困惑(我正在使用g ++ 4.8.3(cygwin)。在代碼中似乎沒有任何依賴關係,會導致單個語句無條件地重複自己,而沒有正式檢查循環退出,如果不成功,適當增加j。我不是彙編語言專家,但表面上看起來像編譯器問題。 –