-1

我已閱讀了有關「如何在數組中找到最低值」的幾個答案。這似乎很簡單,但實施它時,我發現約有10%的時間出現錯誤,其中被確定爲具有最低值的指數沒有最低。在C++ int數組中找到最小值會導致間歇性錯誤?

變量m_siaValue [6] [4]是一個短整數的二維數組,其中所有位置都填充了1到6之間的隨機值。第一個維包含6行(索引0-5),而第二維標識4列(索引0-3)。

變量m_siaIndexOfLowest [6]是一個短整型數組,其索引與m_siaValue [6] [4]數組中的行對應。此數組的值旨在保存m_siaValue每行中最低值單元格(列)的索引。

看起來這麼短暫和簡單,我感到困惑它失敗。但更重要的是,它只能失敗10%的時間。任何人都可以看到什麼可能是錯的?

for (short siX= 0;siX < 6; siX++) { 

    // Assign cell/column 0 as lowest. Then loop through the other 3, 
    // comparing and reassigning if other cells are lower. 
    m_siaIndexOfLowest[siX] = 0; 
    for (short siY = 1;siY < 4; siY++) { 
     if (m_siaValue[siX][siY] < m_siaValue[siX][siY-1]) { 
      m_siaIndexOfLowest[siX] = siY; 
     } 
    } 
} 

輸出顯示錯誤。總計是在此代碼之後立即計算的,在通過從行總和中減去所標識的最低值來顯示或移動數據之前。因此,總的確認錯誤在於確定最低位置,而不是放置或着色單元格。 enter image description here

+0

使用正確的工具來解決這些問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

一個比調試器更好的工具:寫下'3 2 4 3'並手工執行你的算法:「是2小於3?它是,所以丟棄舊的索引並保持1.是4小於2?否,所以保留1.是3小於4?它是,所以丟棄舊的索引並保留3.我們已經到了最後,所以3是最小元素的索引。WTF ?!「 – molbdnilo

回答

2

以下塊中使用的邏輯是錯誤的。你總是比較兩個相鄰的元素。這不會給你最低的價值。

for (short siY = 1;siY < 4; siY++) { 
    if (m_siaValue[siX][siY] < m_siaValue[siX][siY-1]) { 
     m_siaIndexOfLowest[siX] = siY; 
    } 
} 

我建議沿着線的東西:

short indexOfLowest = 0; 
auto lowest = m_siaValue[siX][0]; 
for (short siY = 1;siY < 4; siY++) { 
    if (m_siaValue[siX][siY] < lowest) { 
     lowest = m_siaValue[siX][siY]; 
     indexOfLowest = siY; 
    } 
} 
m_siaIndexOfLowest[siX] = indexOfLowest; 
相關問題