2014-03-03 9 views
2

은 내가 GCC 컴파일러를 사용하고호환되지 않는 포인터 타입 - C

#include<stdio.h> 

void int_frac(double a, long *int_part,double *frac_part) 
{ 
    *int_part = (long int)(a); 
    *frac_part = a - *int_part; 
} 
int main() 
{ 
    long int* ip; 
    double* fp; 
    double i = 1.2345467; 

    int_frac(i,&ip,&fp); 
    printf("%f = %ld + %f",i,*ip,*fp); 
    return 0; 
} 

아래의 프로그램이 있습니다. 이 오류가 나오면 왜

expected long int* but argument is of type long int**

and

expected double* but argument is of type double**

: 이 프로그램은 오류를 제공합니다.

+0

[modf] (http : //linux.die.net/man/3/modf) – BLUEPIXY

+0

@BLUEPIXY 왜 당신은 http://linux.die.net/에 대한 링크를 제공하고 있습니까? Linux에만 해당됩니다. 다음 링크가 더 좋습니다 : http://en.cppreference.com/w/c/numeric/math/modf –

+0

리눅스가 제한적이거나 오래된 정보를 의미하지 않습니다. 그것은 잘 쓰여진 것 같습니다. – BLUEPIXY

답변

4

long int*을 예상 한 곳에 long int**을 전달한다고 컴파일러에서 알려줍니다. 그리고 당신은 double**을 전달할 것이며, 어디에 double*이 올지를 예상합니다.

컴파일러가 정확합니다. iplong int*으로 표시되고 유형의 &ip이 전달되었습니다. fp과 동일한 실수를했습니다.

두 가지 포인터, ipfp을 선언했지만 포인터는 초기화하지 않았습니다. 근본적인 문제는 포인터를 선언했지만 변수를 할당하지 않았다는 것입니다. int_frac이 변수에 쓸 수 있다면 변수는 어딘가에 할당되어야합니다. 따라서 두 값을 선언하고 그 값의 주소를 int_frac으로 전달해야합니다.

코드는해야한다 :

int main() 
{ 
    long int ip; // allocates a variable 
    double fp; // as does this 
    double i = 1.2345467; 

    int_frac(i,&ip,&fp); // pass the addresses of ip and fp 
    printf("%f = %ld + %f",i,ip,fp); 
    return 0; 
} 
4

long int*을 예상 할 때 당신은이 같은 long int ipip을 선언 할 필요는 long int**를 내 의견에 답변을 전달하는대로받은 오류 :

int main() 
{ 
    long int ip; 
    double fp; 
    double i = 1.2345467; 

    int_frac(i,&ip,&fp); 
    printf("%f = %ld + %f",i,ip,fp); 
    return 0; 
}