2017-11-20 2 views
0

은 내가 정의 어느 시점까지 특정 금액을 제공하는 프로그램을 만들려고 노력하고 있어요 "... 작동이 중지되었습니다"여기있다 :재귀 함수; ,

float sum(int n,float m); 

main(void) { 
    float a,m=1.0; 
    int n; 
    scanf_s("%ld", &n); 
    a = sum(n, m); 
    printf("%f", a); 
} 

float sum(int n, float m) { 
    if ((n/m) < 0.0005) { 
     return 0; 
    } 
    else { 
     return n/m + sum(n, m + 2); 
    } 
} 

(I 정의한 점은 0.0005 것을 알) I가 값 큰 5와 동일한 줄 때, 프로그램은 날이 오류를 범 :

...has stopped working

을 또한 I는 0.5처럼 정의 포인트 증가하면 값의 개수가 너무 증가를 줄 수있다. 왜 이것이 일어 났을 것이라고 생각하니 어떻게 해결할 수 있습니까?

+0

가능한 중복 https://stackoverflow.com/questions/26247345/segmentation-fault-using-scanf- : 당신은 반복적 인 솔루션으로 이동하여이 문제를 얻을 수 있습니다 with integer) – Alfabravo

+1

호기심 때문에, 왜'int'에'% ld' ('long int'를 위해)를 사용하고 있습니까? 컴파일러에서 경고를 보셨습니까? – lurker

+1

@Alfabravo 그 질문은 적용되지 않습니다. OP는'scanf_s' 호출을 위해 여기서'& n'을 사용합니다. – lurker

답변

1

scanf_s의 형식 지정자는 long int * 인수를 필요로합니다. 전달할 내용은 int *입니다. 이러한 유형은 호환되지 않습니다. 잘못된 형식 지정자를 사용하면 undefined behavior이 호출되며이 경우 충돌로 나타납니다.

int *에 대한 적절한 형식 지정자는 %d입니다 :

scanf_s("%d", &n); 

편집 :

당신이보고있는 충돌은 아마 스택 오버 플로우입니다. sum 함수는 재귀 적으로 자신을 1000 * n 번 호출합니다. MSVC에서 비슷한 오류가 발생하지만 다른 제한이 있습니다.

float sum(int n, float m){ 
    float result = 0; 
    while ((n/m) >= 0.0005){ 
    result += n/m; 
    m+=2; 
    } 
    return result; 
} 
([정수와는 scanf를 사용하여 세그먼트 오류]의
+0

'n'의 값이 5보다 작 으면 OP에서 왜 여전히 작동하는지 설명 할 수 있습니까? 그것이 정의되지 않은 행동이기 때문입니까? OP는'scanf_s()'를 사용했기 때문에 그는'% ld'를 가지고 컴파일 시간 오류를 주어야하는 Microsoft를 사용해야합니다. – PhotometricStereo

+0

@PhotometricStereo 정의되지 않은 동작입니다. 즉, 충돌 할 수도 있고, 이상한 결과를 줄 수도 있고, 제대로 작동하는 것처럼 보일 수도 있습니다. – dbush

+0

자, 여기에 수정자를 변경했습니다. 하지만 난 아직도 충돌이있어. "5"라고 입력 할 때까지 제대로 작동한다.나는 "5"프로그램을 멈추고 아무런 결과도주지 않고 잠시 멈추고 같은 오류로 멈 춥니 다. –