【发布时间】: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