안녕하세요? 개박살입니다.
저랑 같은 고민을 하셨군요 ^^; 저도 알아낸것이지만요
결론은, x86 CPU의 부동소수점 유닛은 x87특성상 Float연산의 상태를 공유하기 때문에
그것을 Clear해주어야만 한다.. 라고 알고 있습니다. (정확한건 묻지마셈 ^^)
방법은,
#include <float.h> // 먼저 걸고요
_fpreset(); // 요놈을 써서 클리어해주면 됩답니다.
try {
_fpreset();
ShowMessage(IntToStr(a/b));
}
요렇게 한번 해보세요
그럼 참고하세요~
계동원 님이 쓰신 글 :
:
:
:
:
:
:
:
void __fastcall TBaseWindow::Button1Click(TObject *Sender)
:
{
:
int a,b;
:
a = 5 ;
:
b = 0 ;
:
:
try {
:
: ShowMessage(IntToStr(a/b));
:
}
:
catch (...)
:
{
:
ShowMessage("Exception");
:
}
:
}
:
:
실행 파일 탐색기에서 실행시켜서 테스트해봐도...
:
(즉, F9 로 빌더 내에서 실행한것이 아닙니다)
:
:
예외 처리가 되지 않고, Division by Zero 라는 에러가 뜹니다.
:
:
그러나, Debug 모드로 컴파일에서 실행 파일을 실행 시켜보면,
:
제대로 "Exception" 이라는 메세지가 뜹니다. (예외 처리 성공)
:
:
(꼭 풀디버그 모드 아니라도, Disable inline expansions 에
:
체크가 되어 있으면 제대로 예외 처리 됩니다)
:
:
또 웃긴 것은
:
:
try {
:
:
} 안에
:
:
int a = 5;
:
int b = 0; 를 선언하면 '릴리즈' 모드에서도 문제가 없이 예외 처리 됩니다.
:
:
:
도대체 왜~!?
:
:
이런 현상이 생기는 걸까요?
:
:
아악. 고통스럽습니다. 짐작가시는 분 좀 조언 부탁드립니다.
:
:
:
:
:
: