2011-10-29 6 views
3

먼저 C에서 새로 왔으며 C를 사용해야하는 프로그램에 던졌습니다. 이제 내 문제는 포인터와 관련이 있다고 생각하지만 목록을 인쇄하려고하면 (올바른 순서로 프로그램을 저장했는지 확인하기 위해 프로그램이 두 번째로 루프를 빠져 나갔다.)인쇄하는 동안 무한 루프

이것은 가장 짧은 시간에 삽입하는 필자의 삽입 기능이며, 올바르지 만 실행되지는 않았다 내 인쇄 여기

void insertProcess(Process& process, Process* &head, Process* curr, Process* prev){ 
curr = head; 
if(head == NULL){ 
    head = &process; 
} 
else{ 
    prev = head; 
    while(process.timeNeeded > curr->timeNeeded){ 
     prev = curr; 
     curr = curr->next; 
    } 
    prev->next = &process; 
    process.next = curr; 
} 
} 

충돌 목록을 인쇄해야 내 간단한 루프.이이에게 '액세스 VIO을주기 전에 몇 번 실행됩니다 그대로를 테스트 할 수 위치를 읽는 위치 '

while(curr->next != NULL){ 
    printf("%s %i %i %i\n", process.processName, process.arrivalTime,  process.timeNeeded, process.priority); 
    curr = curr->next; 
} 

나는이 오류 코드 중 하나에 오류가있을 것이라고 확신하는데 도움이된다.

편집 : 첫 번째 포스터 덕분에 원래 문제는 해결되었지만 이제는 인쇄 할 때 무한 루프가 발생합니다. 나는 순서대로 삽입하고 결코 마지막 항목 뒤에 NULL 포인터를 설정하지 않기 때문에 그것이 될 것이라고 확신한다. 그게 맞는 것 같습니까? 그렇다면 그것을 고칠 수있는 방법이 있습니까? 다시 한번 감사 함수에서

+1

'Process * & head'는 유효하지 않습니다. c. 참조로 전달할 수 없습니다. – Dave

+0

이것을 C++ 컴파일러로 컴파일하고 있습니까? – Dave

+0

사실 나는 그것이 무엇인지 잘 알고 있었고 우리가 C에 대해 알지 못했고 수업을 배울 시간이 없기 때문에 수업 시간에 무엇을하고 있었는지 알 수 있습니다. 우리가 C를 사용하는 진정한 이유는 C++의 객체 지향 속성을 사용하지 않기 위해서였습니다. 그리고 내가 그랬을 때 옳지 않은 것 같았습니다.하지만 삽입을 할 때마다 헤드가 리셋되고있었습니다. 이것을 할 수있는 다른 방법이 있다면 기꺼이 고칠 것입니다. – user1019430

답변

2

당신은 통과된다 Process 값에 의해 이 함수는 함수가 종료되면 파괴 될 Process 객체의 로컬 복사본에서 작업을 의미합니다.

그러나 코드가이 로컬 복사본에 연결되어 있으므로 함수를 종료하면 연결된 목록에 이미 삭제 된 Process 개체가 사용됩니다.

또 다른 문제는 삽입 지점을 검색하기 위해 반복 할 때 삽입 된 프로세스가 마지막 것일 수는 없으며이 경우 curr이 루프에서 NULL이된다는 점입니다.

+0

고정 된 문제 하나, 내가 보아 왔던 것. 마지막으로 삽입 한 항목을 인쇄하는 무한 루프가 표시되지만 문제를 찾을 수는 있습니다. – user1019430

0

디버거 사용 방법을 배워야합니다. 리눅스에서는 -g (컴파일러가 생성 한 디버깅 정보를 얻으려고)과 (모든 경고를 얻기 위해)을 gcc 또는 g++으로 전달해야합니다. 그런 다음 실행 파일에 gdb 디버거를 사용할 수 있습니다.