2017-08-02 96 views
2

的端我創建保持2個值的簡單的結構對象 - (具體數目)和計數(計數器出現多少次數)。C++爲什麼結構對象值重置回零在循環

typedef struct matrixMissNumber { 
    int number; 
    int count = 0; 
} 

然後,我創建了一個名爲列表,missingNumsObjects,持有這些對象。 missNums是一個簡單的保存整數的分隔列表。

list<matrixMissNumber> missingNumsObjects; 
for (auto m : missNums) 
{ 
    matrixMissNumber mn; 
    mn.number = m; 
    missingNumsObjects.push_back(mn); 
} 

然後,我有3個for-loops通過並檢查2個條件。如果滿足這些條件,則將計數增加1.(爲了測試目的,我添加了一個cout聲明)。 我調試了程序,一切正常,,直到循環結束。這就是當每個matrix的數量變量中的對象missingNumsObjects重置爲0.我不確定它是否存在不同的內存地址被操縱的問題,或列出指針是問題。

for (auto m : missingNumsObjects) 
{ 
    for (int x = 0; x < 3; x++) 
    { 
     for (int y = 0; y < 3; y++) 
     { 
      if (sudoku[x][y] == 0) 
      { 
       if (checkRowRule(m.number, x) == false && checkColumnRule(m.number, y) == false) 
       { 
        m.count++; 
        cout << m.number << " - " << m.count << endl; 
       } 
      } 
     } 
    } 
} 

下一行打印出來的missingNumsObjects計數的值在循環後。這是值返回到0的地方。

for (auto m : missingNumsObjects) 
    cout << m.number << " - " << m.count << endl; 

這項計劃的目的是一個數獨解算器。該算法的這一部分檢查3x3矩陣的缺失數字,並檢查3x3矩陣中有多少空白點可以進入。

+2

打個招呼即可複製構造函數。 –

+2

不要在C++中使用'typedef struct'結構。這不僅是不必要的,而且會造成問題。 – Slava

回答

11
for (auto m : missingNumsObjects) 

這裏auto推導作爲matrixMissNumber,所以m是存儲在列表matrixMissNumber對象的副本。然後您更改副本,而不是列表missingNumsObjects中的對象。

要解決此問題,幫助編譯器正確地推斷類型和週期改爲:

for (auto& m : missingNumsObjects) 
+0

謝謝!現在按計劃運作。我剛剛回到使用C++,我現在纔開始使用「for(auto x:name)」。下次我使用它時,一定會記住這一點 –

+0

@LielvanderHoeven不客氣! –

0

的問題,您將獲得最實際,從這裏

「我調試該程序和一切工作完美,直到 循環結束「。

直到循環結束,事情並不完美。你從來沒有像過去那樣檢查清單的內容,你會注意到它從未改變過。

這樣做的道理是,在調試時,檢查應該改變的東西,而不是你要分配的東西。