|
오버플로의 개념에 혼동이 있으신것 같은데 오버플로는 한개의 변수가 자신이 표현할 수 있는 범위의 수가 넘어갔을 경우 사인비트가 바뀌면서 음수로 표현되는 경우이고 이번 경우는 정상적인 연산에의해 음수가 나온 경우입니다.
이번경우를 오버플로로 생각하고 해법을 찾으면 안됩니다.
99 님이 쓰신 글 :
: 1193 시간이 지난 이후 부터 m_dfDelayTime 값이 음수가 나온것 자체가 오버플로어 문제 입니다.
: 흐흠님, 지나가다님 답변이 맞아요. 간단한 문제 아닌가요.
:
: 이전 틱과 현재 틱을 비교할 때, 현재 틱값이 항상 이전 틱 값보다 크다는 조건이 만족된다면 상관 없겠지만
: 오버플로어로 인해서 그 반대가 되는 경우가 있다면, 그런 부분은 델타 값을 보정해서 처리해줘야 합니다.
:
:
:
:
:
:
:
: 김시환 님이 쓰신 글 :
: : 논리적인 오류는 맞습니다. 다만 Overflow 의 문제는 아닙니다.
: : 이경문님의 답변에서 힌트를 얻었습니다.
: :
: : GetTickCount 함수는 어차피 Overflow 가 되면 0으로 초기화 시키고, 아래 변수들 중에서 m_dfDelayTime 은 제가 일부러 double 로 선언했기 때문에 Overflow는 발생하지 않습니다.
: :
: : 문제는 1193시간이 지난후부터 m_dfDelayTime 값이 계속 음수가 나오기 때문에 if(m_dfDelayTime > 10) 문이 참이 될수 없다는 것이네요.. 결국 m_dfDelayTime 이 음수가 되면 m_dfStartTime 변수를 다시 갱신해 주는 코드가 한줄 필요하네요...
: :
: : 답변해 주신분들 감사합니다. 이래서 토론이 좋은것인가 봅니다. 머리싸매고 토론하다 보면 좋은 결론이 나오네요..
: :
: :
: :
: : while(!Terminated)
: : {
: : m_dfDelayTime = (GetTickCount() / 1000.0) - m_dfStartTime ;
: :
: : if( m_dfDelayTime < 0) m_dfStartTime = GetTickCount() / 1000.0 ; <-- 한줄추가..
: :
: : if(m_dfDelayTime > 10) // 10초에 한번씩 시스템데이타를 읽어 온다.
: : {
: : Data_Read() ;
: :
: : m_dfStartTime = GetTickCount() / 1000.0 ;
: : }
: :
: : if(user_stop == true) this->Terminate() ;
: :
: : if( g_dfTestTime <= 0) Sample_Test()
: : }
: :
: :
|