반응형
[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]);
}
반응형
'IT > C C++ 컴파일 에러' 카테고리의 다른 글
[C/C++ 에러] C2375 : '~~': 재정의. 링크가 다릅니다. 오류 (0) | 2023.07.23 |
---|---|
[C/C++ 에러] Visual Studio의 0xC00000FD: Stack overflow 오류 (0) | 2021.02.22 |