【问题标题】:What might cause intermittent error in finding the lowest value in a C++ int array?什么可能导致在 C++ int 数组中查找最小值时出现间歇性错误?
【发布时间】:2017-07-24 10:37:56
【问题描述】:

我已经阅读了几个与“如何找到数组中的最小值”相关的答案。这看起来很简单,但在实施它时,我大约有 10% 的时间会看到错误,其中被识别为具有最低值的索引没有最低值。

变量 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;
        }
    }
}

输出显示错误。总计在此代码之后立即计算,在任何数据显示或移动之前,通过从行的总和中减去已识别的最低值。因此,总数确认错误在于识别最低值,而不是放置或着色单元格。

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 比调试器更好的工具:写下3 2 4 3 并手动执行您的算法:“2 小于 3 吗?是的,所以丢弃旧索引并保留 1。小于 4比2?不,所以保留1。3是否小于4?是,所以丢弃旧索引并保留3。我们已经到了最后,所以3是最小元素的索引。WTF?!“

标签: c++ arrays visual-studio visual-studio-2010 multidimensional-array


【解决方案1】:

以下块中使用的逻辑是错误的。您总是在比较两个相邻的元素。这不会给你最低的价值。

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;

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2016-12-09
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多