2014-11-21 1 views
1

나는 힙을 사용하여 알파벳 순서로 읽는 것을 궁극적으로 시도하고 있습니다. 전에 힙을 한 번도 해본 적이 없기 때문에 내 책을 따라 가고 있습니다. 사전에 단어의 개수를 알 수 없으므로 cin을 사용하여 동적으로 할당 된 배열에 단어를 저장합니다. 별도의 코드에서 나는 그것이 읽고 배열이 더 크게지고 있다는 것을 압니다. 그런 다음이 어레이를 무거워하려고 노력하고 있지만 프로그래밍에 익숙하지 않아서 세분화 오류가 계속 발생합니다. 어떻게 잘못했는지 추적하는 방법을 결정할 수 없습니다.heapify 알고리즘을 쓰려고 시도했습니다. 세그먼트 화 오류

void Heap::make(){ 
    //make a heap from wordArray 
    //r = last non-leaf 
    for(int r = size/2; r > 1; r--){ 
     int c = 2 * r; //location of left child 
     while(r <= size){ //size is a data member of Heap 
//if r has 2 children and right is larger, make c the right child 
      if((c < size) && (wordArray[c] < wordArray[c+1])){ 
       c++; 
      } 
//fix if parent failed heap-order condition 
      if(wordArray[r] < wordArray[c]){ 

       swap(wordArray[r], wordArray[c]); 
       r = c; //check that it didn't get messed up at c 
       c = 2 * c; 
      } 
      else{ 
       break; //heap-order condition holds so stop 
      } 
     }  
    } 
} 

나는 프로그램이 if(wordArray[r] < wordArray[c]) 부분까지 작동하는지 확인할 수 있습니다 couts와 장난에서이 내 heapify 코드입니다. wordArray의 요소는 불타고 있으며 비교기는 외부 테스트에서 올바르게 작동합니다. 이 배열이 동적 인 것과 관련이 있습니까? 나는 내가 여기서 잘못하고있는 것에 혼란 스럽다. 그것은 N-1 라인 arr[n-1];//this is the nth element

분할 오류 코드에서 여기 발생의의에 의해

+1

문제의 원인을 찾기 위해 코드를 디버깅 해 보셨습니까? –

+1

데이터 유형, 배열 최대 값 등을 모른 채로 r == size 일 경우 크기보다 큰 c == 2 * 크기. 그런 다음 wordarray [c]가 정의되지 않습니다. – LeppyR64

+1

제 생각 엔 당신은 배열의 끝을 지나쳐 읽는 것 같습니다. wordArray [c], c = 2 * r = 2 * size/2를 처음 쳤을 때 wordArray [size]를 읽었을 수도 있지만 인덱스가 0이므로 끝까지 지나치지 않습니다. – TravisJ

답변

2

범위를 벗어납니다. 당신이 검사 할 때 :

c은 마지막 요소입니다
if((c < size) 

, 여기서 경계로부터 판독 :

if((c < size) && (wordArray[c] < wordArray[c+1])){ 
              ^

은 검사해야한다 :

if((c+1 < size) 


그리고 또 다른 문제 여기에 있습니다 :

while(r <= size) 

r == size 인 경우 분명히 범위를 벗어 났을 때 코드에 r이 사용됩니다. 크기 n의 배열

그들의 요소이므로 요소가 정의되지 않은 동작이다 n번째 액세스, 0 to n-1로 간다.

1

당신은 배열의 n 번째 요소에 액세스 할 수 있습니다

(wordArray[c] < wordArray[c+1]) // try to modify this. 

size = 6

Whwn for() 루프를 가정 할 수 있습니다 c = 2 * 6은 6을 의미하고 arr[6] and arr[6+1]에 액세스하는 것은 유효하지 않습니다. 배열 인덱스는 1 대신 1부터 시작합니다.