2013-07-24 14 views
3

저는 함수 프로토 타입에 대해 잘 알고 있습니다.이 오류는 함수 선언 오류 인 것 같습니다. 이는 내가이 경고와 오류를 보게 된 이유에 대해 정말 당황 스럽다는 것을 의미합니다.함수의 암시 적 선언 x

gcc가 내 함수 프로토 타입을 완전히 무시한 것 같습니다. 이것은 컴파일러 버그입니까?

간결함을 위해 별도의 헤더 파일에서이 함수를 선언하지 않았지만 아무런 차이가 없어야합니다.

GCC 출력 :

$ gcc -Wall -std=c99 -pedantic primefactors.c 
primefactors.c: In function ‘main’: 
primefactors.c:8:5: warning: implicit declaration of function ‘largestprime’ [-Wimplicit-function-declaration] 
primefactors.c: At top level: 
primefactors.c:12:6: error: conflicting types for ‘largestprime’ 
primefactors.c:8:20: note: previous implicit declaration of ‘largestprime’ was here 

코드 :

#include <stdio.h> 
#include <math.h> 

long largetsprime(long); 

int main() 
{ 
    printf("%d\n", largestprime(600851475143)); 
    return 0; 
} 

long largestprime(long num) 
{ 
    int highest; 
    int mid = sqrt(num); 
    for (int i = 2; i < mid; i++) { 
     if (mid % i == 0) { 
      if (i % 1 == 0 && i % i == 0) 
       highest = i; 
     } 
    } 
    return highest; 
} 
+3

의견은 downvote와 관련하여 좋을 것입니다. – TheBlueCat

+0

왜 아래로 투표합니까? – haccks

답변

10

이 포인트-1
당신은 함수 이름에 largest 철자가 선언에서

long largetsprime(long) 
     ^
      s is wrong here 

그것은해야을

long largestprime(long) 
     ^before t 

포인트 2 당신은 math.h에서 sqrt() 라이브러리 함수를 사용하는
, 당신은 -lm로 프로그램을 컴파일해야합니다

gcc -Wall -std=c99 -pedantic primefactors.c -lm 

포인트 3 함수의 반환 타입 반면 int을 반환하는
long입니다. printf()의 호출

포인트-4 하나 더 실수 제안 당신은 long int에 대한 접미사를 추가 잊어 버렸습니다.

largestprime(600851475143) 

은 다음과 같아야합니다

largestprime(600851475143L) 
     //    ^added suffix L for long 

당신이 다음 읽을 접미사 L 인식하지 못하는 경우 : What does the “L” mean at the end of an integer literal?

감사에 Eric Postpischil @

포인트 5 :printf()에서 main() 기능이 인쇄 중입니다.당신이 그것을 인쇄 할 %d 형식 지정자를 사용한 반면,210 정수 유형 :

printf("%d\n", largestprime(600851475143)); 
       ^
       | 
       returns long 

사용 %ld 대신.

점 6 : 가장 주요한 기능 i % 1 == 0 and i % i == 0

if -condition는 i % 1 = 0는 (모든 숫자 1로 나누어) 때문에 서로 항상 참 (i가 0 인 경우, 후자를 제외하고는 정의되지 않는다)이다.

+0

제안 해 주셔서 감사합니다. 나는이 프로젝트의 오일러 문제를 해결하기 위해 지난 몇 시간 동안이 코드를 리팩터링했다. 그것은 아마도 내 최고의 코드가 아닙니다. – TheBlueCat

+1

@TheBlueCat 문제가 없습니다. BlueCat! 나는 내가 만난 점을 공유하고 싶었다. 천만에요! –

+1

예, 저는 C의 리터럴을 알고 있습니다.하지만 고맙습니다. 어쨌든 유용하다고 생각합니다. – TheBlueCat

1

당신은 프로토 타입에 오타가 있습니다. largetsprime 대신 largestprime이어야합니다.

1

당신은 프로토 타입에서 오타가 :

largetsprime != largestprime 
2

오타. 선언문은 largeTSprime입니다. 올바른 largestprime으로 변경하면 제대로 작동합니다.

ProTip # 1 : 가독성을 위해 camelCapsOnWordBoundaries 또는 을 사용하십시오.

ProTip # 2 : 거의 컴파일러 버그가 아닙니다.

+0

잘 시간의 99.99 %. – TheBlueCat

+0

@ TheBlueCat '거의'알았습니까? –

+0

나는 그것을 더 정량화하기를 원했다. gcc는 꽤 안정적이며, 특히 안정적인 배포판에서는 안정적입니다. – TheBlueCat

관련 문제