아래 4273번에 질문한 문제에 대해 나름대로 알아 본것인데요
보통 수학함수의 에러는 _matherr 과 _matherrl 을 통해 처리되는데
이 함수를 사용자가 다시 정의해주면 에러가 발생하면 정의된 곳으로 가서
처리하게 되어 있습니다.
빌더 1.0 에서는 이것이 잘 작동하여 사용자가 제어할 수 있는데
빌더 3.0에서는 작동하는데 문제가 있는 것 같습니다.
1.0버전에서는 다음과 같이 하면
int _matherr (struct exception *e) {
if (e->type == OVERFLOW) return 1;
else return 0;
}
double tmp = sinh (100000.);
sinh 함수가 overflow 에러가 발생하면 위의 _matherr 함수가 호출되고
값 1이 리턴됩니다. _matherr 가 0 이 아닌 값을 리턴하면 프로그램은
더이상 에러를 다루지 않게 되고 따라서 에러 윈도우가 뜨지 않게 됩니다.
overflow 가 아닌 에러가 발생하면 0 이 리턴되므로 에러윈도우가 뜨게 됩니다.
빌더 3.0에서는 조금 문법이 바뀐 것 같은데 제가 찾아낸 바로는 다음과
같이 해야할것 같습니다.
int _matherr (sturct math_exception *e){
if (e-type == OVERFLOW) return 1;
else return 0;
}
exception 이 math_exception 으로 바뀔거에요 이것은 math.h 를 살펴보면
알 수 있습니다. 그러나 여기서 문제는 위의 함수가 작동하지 않는다는 것입니다.
수학함수의 에러가 나도 _matherr로 가지 않고 overflow 에러 윈도우가 떠버립니다.
아마 math.h 에 문제가 있는가 봅니다. 물론 console 프로그램에서도 같은
ㄱ
결과가 나타납니다.
여기까지가 제가 발견한 것이고 지식이 일천한 관계로 직접 math.h 를 보고
고치진 못하겠군요.
이거 못고치면 빌더 1.0 으로 프로그램해야할 형편입니다.
부디 실력있는 분의 수고로 문제가 해결되었으면 좋겠군요.
|