2013-03-02 3 views
-1

이 함수는 정수 배열, 배열의 요소 수인 을 취해 배열의 주 요소를 찾습니다. 주 요소가있는 경우 * 결과에 포함되고 함수는 true를 반환합니다. 주 요소가없는 경우 false를 반환합니다. 이 경우 * 결과를 사용하지 않아야합니다.C에서 함수 디버깅

필자가 작성한 프로그램에 대한 내 출력이 제대로 작동하지 않습니다. 이는 필자가 생각하는 findMajority 기능 때문입니다. http://pastebin.com/Q5ycXHrg

이처럼 내 출력 모습입니다 : http://pastebin.com/7P1ZTpML

이는 입력 : 여기에

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 
1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 
1 2 3 
1 1 1 
1 2 1 
1 2 
1 1 
2 
1 1 1 1 2 3 4 5 6 7 

는 기능입니다

는 출력이처럼 보이도록되어있는 것이다 :

+0

"질문"에 질문이 표시되지 않습니다 ... –

+0

실제로 매우 분명합니다. 의도 한 출력과 비교할 때 내가 생산하는 출력이 올바르지 않습니다. –

+0

[C 프로그램의 잘못된 출력] 가능한 중복 (http://stackoverflow.com/questions/15169454/incorrect-output-in-c-program). 사이트 요구 사항을 준수하기 위해 질문을 개선하려고 시도하고 있지만 완전히 새로운 질문을 작성하는 것이 아니라 원래 질문을 편집하여 ('edit' 링크 사용) 선호합니다. –

답변

1

귀하의 기능에 많은 홍보 효과가 있습니다. oblem.

  1. counter을 intialising없이 당신은 그것을 증가하는
  2. array[count]이 유효한 마지막 요소 인 또는 array[count-1]가 액세스하는 count= 3이 코드 for(j=0; j <= count; j += 2){

    if(*(array + j) == *(array + (j + 1))){ 
         *(array + (count + 1)) = *(array + j); 
         bcount++;//how many numbers on the end of the array 
        }} 
    

    에서 올바른

  3. 입니다 확인 여부를

  4. array[4]array[5]

  5. 그리고 이것은 무한 루프입니다. 루프 내에서 조건 변수를 수정하지 않습니다. while(*(array + k) == 0) { candidate = *(array + k); }
1

디버거를 사용하여 프로그램을 디버깅하는 방법을 배우는 것이 좋습니다. 예를 들어, 다음과 같이 코드를 포장 후 :

#include <stdio.h> 

typedef enum { false, true } boolean; 

// (((your function here))) 

int main(int argc, char* argv[]) 
{ 
    int result = 0; 
    int number = 0; 

    int test[] = { 1, 1, 1, 1, 1, 1, 1 }; 


    result = findMajority(&test[0], sizeof(test)/sizeof(int), &number); 

    printf("Result = %d, Number = %d\n", result, number); 

    return 0; 
} 

가정 당신이 다음 명령을 실행할 수있는 'question.c'에이를 넣어 (당신이 GCC와 GDB가 가정) :

$ gcc -g -o question question.c 
$ gdb ./question 
(gdb) b findMajority 
Breakpoint 1 at 0x80483ea: file question.c, line 6. 
(gdb) run 
Starting program: ./question 
Breakpoint 1, findMajority (array=0xbffff4bc, count=7, result=0xbffff4d8) at question.c:6 
6  int i, counter, bcount = 0, ccount = 0, candidate, j;  

그런 다음 n 명령을 사용하여 다음 줄로 이동하고 p 명령을 사용하여 변수를 인쇄하여 잘못된 점을 확인할 수 있습니다. 예를 들어, Toms가 상대적으로 빠르게 포인터를 가리키는 문제 중 일부를 찾을 수 있습니다.

39  while(*(array + k) == 0){ 
(gdb) n 
40   candidate = *(array + k); 
(gdb) n 
39  while(*(array + k) == 0){ 
(gdb) n 
40   candidate = *(array + k); 
(gdb) n 
39  while(*(array + k) == 0){ 
(gdb) n 

무한 루프가 있습니다.

(gdb) p counter 
$3 = -1207959944 

그리고 초기화되지 않은 카운터가 있습니다.

프로그래밍 학습의 일부는 잘못 된 것을 결정하는 전략을 파악하고 있습니다. 어떤 사람들은 gdb과 같은 텍스트 기반 디버거를 사용하기를 원합니다. Eclipse CDT에서 찾을 수있는 그래픽 디버거와 같은 사람들도 있습니다.어떤 사람들은 코드 전체에 printf() 문장을 씁니다.

톰스처럼 정말로 좋은 사람이라면, 그것을 읽고 문제를 풀 수 있습니다. ;-)