IT/C C++ 컴파일 에러

[C/C++] C2440 : double 에서 'double *' 으(로) 변환할 수 없습니다

크몽 '경매하는 개발자' 님의 경매/부동산/IT/사업 채널 2022. 5. 20. 10:14
반응형

[C/C++] C2440 : double 에서 'double *' 으(로) 변환할 수 없습니다

이번 시간은 C2440 캐스팅 에러에 대해 알아보고자 한다.

반응형

 


현상

- 필자의 소스코드를 간단하게 정리하면 아래와 같다. 위에 함수 사용을 선언하고 메인함수 이후 함수 값을 리턴하는 형태인데, 코드를 돌려보면 C2440 : double → double * 로 변환할 수 없다는 에러가 뜬다.

 

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

double optmach(double, double double[]);  // (1)

void main()
{
	double a = 1.0;
    double b = 2.0;
    double c[5];
    
    c[0] = 0.0;
    c[1] = 0.1;
    c[2] = 0.2;
    c[3] = 0.3;
    c[4] = 0.4;
    
    double result = optmath(a, b, c);  // (2)
	system("pause")
}

double optmach(double a, double b, double c[])  // (3)
{
	return(a+b+c[0]+c[1]+c[2]+c[3]+c[4]);
}

 

- 원인은 매개변수로 받는 c가 포인터 배열로 묵시적 캐스팅이 되었기 때문으로 보인다. 함수를 실행하는 (2)에서 매개변수로 받는 c가 배열이지만 함수를 선언하는 (1)에 마우스를 올려보니 배열부분이 포인터배열(double*)로 캐스팅 된 것을 확인하였다.

- 정리하면, 함수실행부(2)에서는 "나는 배열 c를 매개변수로 받았음", 함수선언부(1,3)에서는 "어 나는 포인터 배열로 받아야하는데, 배열 c를 받았네? (double) c -> (pointer double) *c로 캐스팅해야겠다!" 라고 판단하여 묵시적 캐스팅을 수행하였고, 주소값이 아닌 실제값이 매개변수로 들어오니 C2440 에러를 리턴하게 된 것으로 보인다.

반응형

 

 

 

해결

- 함수선언부(1)에 (3)에서 정의한 매개변수명을 아래와 같이 똑같이 작성하니 문제가 해결되었다.

- 함수에서 배열로 받을때 포인터배열(주소값)이 아닌 배열로 받아야한다고 명시적으로 선언하니 올바르게 링킹이 된 듯 하다.

반응형

 

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

double optmach(double a, double b, double c[])  // (1) : (3)과 동일하게 작성

void main()
{
	double a = 1.0;
    double b = 2.0;
    double c[5];
    
    c[0] = 0.0;
    c[1] = 0.1;
    c[2] = 0.2;
    c[3] = 0.3;
    c[4] = 0.4;
    
    double result = optmath(a, b, c);  // (2)
	system("pause")
}

double optmach(double a, double b, double c[])  // (3)
{
	return(a+b+c[0]+c[1]+c[2]+c[3]+c[4]);
}​
반응형