2014-07-26 3 views
0

다음 코드에서 if 문을 종료하지 않고 j ++에서 j를 증가시키지 않고 cout 문 (가끔씩)을 반복합니다. 때때로 루프는 예상대로 작동합니다 (j ++은 각 cout에 대해 한 번씩 증가하고 명령문이 종료됩니다). 나는 이것을 보았고 (그리고 보았다 ...) 내가 잘못한 것을 알아낼 수 없다. 어떤 아이디어?루프가 아무 이유없이 반복됩니까?

void SlipHash::outputHashTable() { 
     ios_base::fmtflags fmtflg = cout.flags(); 
     const int size = min(nEntries, tableSize); 
     for (int i = 0, j = 0; j < size; i++) { 
     if (hashTable[i]) { 
      j++; 
      cout << left << setw(27) << "SlipHash::outputHashTable[" << dec << i << "] " 
       << hex << hashTable[i] << endl; 
     } 
     } 
     cout.flags(fmtflg); 
    }; // void SlipHash::outputHashTable() 
+1

해시 테이블의 내용에 따라 동작이 달라지지 않습니까? 0이 포함되어 있으면 인쇄하지 않고 'j'를 증가시키지 않습니다. 당신의 코드에서'j'의 함수는 무엇입니까? – Floris

+1

hashTable [i]가 false 일 때 단순히'j'를 증가시키지 않는 경로가 있습니다. 즉, 연산자 []를 사용하면이 오버로드로 인해 거의 모든 것이 해결 될 수 있습니다. 최소한의 코드 만 제공하십시오. –

+2

'j '를 증가시키지 않고 어떻게 인쇄하는지 어떻게 알 수 있습니까? 디버거에서 문제를 반복 할 수 있습니까? –

답변

0

if 문을 입력 할 때 j 변수를 증가시키지 않고 cout을 사용할 수 없습니다. nEntries 및 tableSize 및 right 값을 확실합니까? 당신이 값이 우수한 경우 해시 테이블 [size_table] 필드에서 메모리에 값을 사용하거나 심지어 무한 루프를 만들 수없는 경우 열등한 경우 j는 당신이했습니다 것으로 보인다 크기 VAR

+0

hashTable [i]! = NULL 인 경우 코드가 j를 한 번 증가시키고 cout을 여러 번 실행하면 코드가 다음 테이블 항목을 확인합니다. 검사 종료가 실행되고 테이블에 nEntry가있는 한 루프는 무한 할 수 없습니다. –

2
for (int i = 0, j = 0; j < size; i++) { 

에 도달하지 않기 때문에 잘못 입력 ;;

for (int i = 0, j = 0; j < size; j++) { 
//        ^

또는

for (int i = 0, j = 0; i < size; i++) { 
//     ^

이 올바르지 않습니다.

+0

당신의 교정은 효과가 없을 것입니다. 일반적으로 j는 해시 테이블의 항목 수는 테이블의 크기보다 훨씬 적습니다. 나는 엔트리를 볼 때마다 j를 증가시키고 모든 엔트리가 고갈되면 테이블을 종료한다. 당신의 솔루션에서 나는 일찍 끝낼 것입니다. 테이블 크기 = 1024이고 테이블 항목 = 3이면 해시 테이블 항목이 아닌 세 번째 해시 테이블 위치 이후에 항목이없는 경우에도 존재합니다. –

+0

@ArthurSchwarez 오, 코드를주의 깊게 읽지는 않았습니다. 그렇다면'tableSize'에 버그가 있다고 생각합니다. 디버깅을 시도한 적이 있습니까? – ikh

+0

나는 이해하지 못한다. tableSize가 가지고있는 유일한 함수는 nEntries의 최대 값을 설정하는 것입니다. 잘못된 루프는 주변에 루프가없는 cout 문의 주위에 있습니다. 나는 혼란 스럽다. (gg ++ 4.8.3 (cygwin)을 사용하고있다.) 루프 종료를 공식적으로 점검하지 않고 무조건적으로 하나의 명령문을 반복하게하는 코드에는 아무런 의존성이없는 것처럼 보인다. j를 적절하게 증가시킵니다.나는 어셈블리 언어 전문가가 아니지만 표면에 컴파일러 문제처럼 보입니다. –

관련 문제