2011-12-04 5 views
2

해결할 수 없지만 현재 컴퓨터에서 메모리 문제 일 수 있다는 사실을 거의 받아들입니다.초기화 프로그램이 두 번째 배열을 덮어 씁니다.

나는이 초기화가 :

Search::Search(ifstream& inFile) 
{ 

    int id = 0; 
    int i = 0; 

    inFile >> id; 

    while (inFile) { 

     if(i < SEARCH_DATA_SIZE) { 

      SearchDataFirst[i] = id; 
      SearchDataFirstSorted[i] = id; 

     } else if(i >= SEARCH_DATA_SIZE) { 

      SearchDataLast[i] = id; 
      SearchDataLastSorted[i] = id; 

     } 

     i++; 
     inFile >> id; 
    } 

} 

그리고 내 헤더에 내가 지금과 같은 개인 데이터를

:

CONST의 INT SEARCH_DATA_SIZE = 20; 내가 배열의 인쇄 작업을 수행 할 때

int SearchDataFirst[SEARCH_DATA_SIZE]; 
int SearchDataLast[SEARCH_DATA_SIZE]; 
int SearchDataFirstSorted[SEARCH_DATA_SIZE]; 
int SearchDataLastSorted[SEARCH_DATA_SIZE]; 

는 초기화는

, INFILE에서 처음 20의 int를 얻기를 저장 한 후 다음 기록에 가서 별도의 배열에 그 저장한다 SearchDataFirstSorted에는 SearchDataLast의 값이 있습니다. 가능한 경우 발생하지 않을 수도 있습니다. SearchDataLastSorted에는 이상한 펑키 숫자가 있습니다.

검색된 데이터 첫 번째 괜찮습니다.

저는 프로그래밍 언어에 대해 좌절하지 않았습니다.

잘하면 도움을 줄 수 있습니다.

다른 점이 없으며이 시점에서 이니셜 라이저 만 호출됩니다.

답변

1

i >= SEARCH_DATA_SIZE이면 SearchDataLast[i]이 바깥 쪽을 가리키고 있습니다. SearchDataLast! 당신이 정말로 필요한 것은이 같은 것입니다 :

입니다
for(int i = 0; i < SEARCH_DATA_SIZE; ++i) 
    { 
     inFile >> id; 
     SearchDataFirst[i] = id; 
     SearchDataFirstSorted[i] = id; 
    } 
    for(int i = 0; i < SEARCH_DATA_SIZE; ++i) 
    { 
     inFile >> id; 
     SearchDataLast[i] = id; 
     SearchDataLastSorted[i] = id; 
    } 

, 당신은 SearchDataFirst을 채우지을 완료 한 후 다시 0으로 i를 재설정해야 당신은 SearchDataLast을 채우기 시작하기 전에.

+0

알았어, 네가 그곳에서 뭘했는지 알아. 고마워. 정말 고마워. – superesp

+0

천만에! – ruakh

0

논리가 의미가 없습니다. 현재의 형태로 참으로 이어질 않는 (당신이 SearchDataLast에 쓰기를 시도하고 SearchDataLastSorted 배열의 경계를 넘어 모든 단일 요소를

} else if(i >= SEARCH_DATA_SIZE) { 
    SearchDataLast[i - SEARCH_DATA_SIZE] = id; 
    SearchDataLastSorted[i - SEARCH_DATA_SIZE] = id; 
} 

: 내가 이해할 수있는 최선의, 당신이 그런 짓을하려는 메모리 손상).

0

귀하의 문제는 여기에 있습니다 : 그들은 크기 SEARCH_DATA_SIZE의이고 i이 그 금액보다 크거나 같은 때문에

else if(i >= SEARCH_DATA_SIZE) { 

     SearchDataLast[i] = id; 
     SearchDataLastSorted[i] = id; 

    } 

당신은, SearchDataLastSearchDataLastSorted의 경계 과거의 것입니다. 원하는 항목은 i - SEARCH_DATA_SIZE입니다.

이로 인해 정의되지 않은 동작이 발생합니다. 여기서는 컴파일러가 각 배열에 대해 순서대로 메모리를 할당했습니다. 따라서 기본적으로 SEARCH_DATA_SIZE 요소를 건너 뛰고 SearchDataLast에 입력하고 원하는 값을 SearchDataFirstSorted에 저장합니다.

0

SearchDataLastSearchDataLastSorted 배열을 오버런하지 않았는지 확인하지 않아도됩니다.

iSEARCH_DATA_SIZE 이상이되면 배열을 전환하지만 ... 에서 계속 색인을 생성하여 SearchDataLast 배열보다 큽니다.

아마, 당신은 같은 것을 쓸 예정 :. 당신은 아직도 당신이 i2 * SEARCH_DATA_SIZE 이상하지 않음을 보장 (이 배열의 끝을 오버 플로우하지 않도록해야합니다

else if (i >= SEARCH_DATA_SIZE) 
    { 
     SearchDataLast[i-SEARCH_DATA_SIZE] = id; 
     SearchDataLastSorted[i-SEARCH_DATA_SIZE] = id; 
    } 

관련 문제