-1

"배열에서 가장 낮은 값을 찾는 방법"과 관련된 여러 답변을 읽었습니다. 그것은 간단 해 보이지만 그것을 구현할 때, 가장 낮은 값을 가진 것으로 식별 된 색인이 가장 낮지 않은 오류의 대략 10 %를보고 있습니다.C++ int 배열에서 가장 낮은 값을 찾는 데 간헐적 인 오류가 발생할 수 있습니까?

변수 m_siaValue [6] [4]는 short int의 2 차원 배열이며 모든 위치는 1에서 6 사이의 임의 값으로 채워집니다. 첫 번째 차원에는 6 개의 행 (인덱스 0-5)이 포함됩니다. 두 번째 차원은 4 개의 열 (인덱스 0-3)을 식별합니다.

변수 m_siaIndexOfLowest [6]는 m_siaValue [6] [4] 배열의 행에 대한 인덱스에 해당하는 짧은 int 배열입니다. 이 배열의 값은 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

오른쪽 도구 디버거는 다음과 같습니다

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

나는의 라인을 따라 뭔가를 제안한다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (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을 유지하십시오. 1. 3을 3보다 작습니까? 그렇기 때문에 이전 색인을 버리고 3을 유지하십시오. 끝까지 도달 했으므로 3은 가장 작은 요소의 색인입니다 .WTF?! " – molbdnilo

답변

2

다음 블록에서 사용 된 논리가 잘못되었습니다. 항상 인접한 두 요소를 비교하고 있습니다. 그것은 당신에게 가장 낮은 가치를주지 않습니다. 이러한 문제를 해결하기

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; 
관련 문제