Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[10801] 최적화 문제는 아닌듯 합니다.
델파이날개 [] 1389 읽음    2006-07-19 01:41
.
제가 처음의 글에도 썼듯이 bEnabled, bCompleted는 record type의 멤버 변수 입니다.
그러니까

TMyRecord = record
   bEnabled : Boolean;
   bCompleted : Boolean;
end;

와 같이 되어 있는것 입니다.

코드 최적화의 문제라면 브레이크 포인트가 안 잡히거나 Trace Into, Step Over에 안 잡히더래도
변수값은 변경되어 있어야 하지만 if 문 안으로 진입하지 않을 뿐더러 변수값 역시 아무런 변화가
없습니다.

결과적으로 if 문의 조건을 제대로 검사하지 못한 경우인 것입니다. 여튼 현재로서는 두번째 문장과
같이 임시로 해결을 해두었습니다. 도움 감사합니다.

다른분들 중에 이 문제에 봉착해서 어려움을 겪었던 분은 안 계신지요?



civilian,안영제 님이 쓰신 글 :
: 델파이의 버그가 아니라 컴파일 최적화가 이루어졌기 때문으로 보입니다.
:
: procedure TForm1.Button1Click(Sender: TObject);
: var
:   bEnabled, bCompleted: Boolean;
: begin
:   bEnabled := True;
:   bCompleted := True;
:   if (bEnabled = TRUE) AND (bCompleted = TRUE) then
:   begin
:      bEnabled   := FALSE;
:      bCompleted := FALSE;
:   end;
: end;
:
: 이런 코드라면, 실제 begin .. end 구간의 내용에서 할 일이 없기 때문에 브레이크 포인트를 걸어도
: 당연히 진입하지 않습니다.
:
: procedure TForm1.Button1Click(Sender: TObject);
: var
:   bEnabled, bCompleted: Boolean;
: begin
:   bEnabled := True;
:   bCompleted := True;
:   if (bEnabled = TRUE) AND (bCompleted = TRUE) then
:   begin
:      bEnabled   := FALSE;
:      bCompleted := FALSE;
:      ShowMessage('들어왔음');
:   end;
: end;
:
: 이렇게 ShowMessage를 하나 넣으면 당연 들어옵니다.
:
: 컴파일 최적화는 프로젝트 옵션에서 주는 것이지만 특정 구간에서 컴파일 최적화를 하지 않으려면
:
: {$O-}
: procedure TForm1.Button1Click(Sender: TObject);
: var
:   bEnabled, bCompleted: Boolean;
: begin
:   bEnabled := True;
:   bCompleted := True;
:   if (bEnabled = TRUE) AND (bCompleted = TRUE) then
:   begin
:      bEnabled   := FALSE;
:      bCompleted := FALSE;
:   end;
: end;
: {$O+}
:
: 이렇게 컴파일 지시자를 넣으면 됩니다.
:
: 그럼...
:
: 델파이날개 님이 쓰신 글 :
: : .
: : 델파이 7 을 사용하던 중에 아래의 if 문이 제대로 동작 않는 오류(버그?)를 발견했습니다.
: :
: :             if ( bEnabled = TRUE ) AND
: :               ( bCompleted = TRUE ) then
: :             begin
: :                bEnabled   := FALSE;
: :                bCompleted := FALSE;
: :             end;
: :
: : 이와같이 문장을 작성해서 런해보면 if 안의 모든 조건이 TRUE인 상황에서도 if 블럭이 실행 안됩니다.
: : 그래서 위의 문장을 아래와 같이 수정하면 이상없이 동작합니다.
: :
: :             if bEnabled AND
: :               bCompleted then
: :             begin
: :                bEnabled   := FALSE;
: :                bCompleted := FALSE;
: :             end;
: :
: : 그러니까 불린 변수를 = TRUE와 같이 비교하면 if 문제어 제대로 못 잡아주는군요.
: : 저는 C++ 을 하던 사람이라 아래문장을 싫어하는 편입니다. 아니, C++을 하던 습관 때문이라기 보다
: : bEnabled, bCompleted 가 명백하게 어떤 데이타 타입인지를 if 조건으로 알 수 없는 것을 싫어 하기
: : 때문에 bEnabled = TRUE 와 같이 비교를 하는거죠.
: :
: : PASCAL 은 if 문의 조건으로 boolean만 허용하긴 하지만, C++ 부터 주욱 if 문 안의 조건으로 들어가는
: : 변수들의 명백한 타입을 표현하기 위해 위의 표현법을 주로 쓰고 있는겁니다.
: :
: : 두번째 문장만 제대로 동작하는 문제가 델파이 7 에서 해결이 되었는지요? 첫번째 문장을 지금까지 계속
: : 사용해서 아무런 이상이 없었는데 최근에 이 문제가 발생했습니다.
: :
: : bEnabled, bCompleted는 record type안에 들어있고 if 문은 Thread.Syncronize( )를 통해 불려진 함수
: : 안에 있습니다. 어쩌면 Thread 에서 호출되었기 때문에 발생하는 문제일 수도 있겠습니다.
: :
: : 이 문제에 경험이 있으신 분들은 답좀 부탁 드립니다. 그럼 수고하십시요.
: : .

+ -

관련 글 리스트
10798 델파이 7 에서 불린 검사의 오류... 해결이 되었나요? 델파이날개 1496 2006/07/18
10799     Re:델파이 7 에서 불린 검사의 오류... 해결이 되었나요? civilian,안영제 1575 2006/07/18
10801         최적화 문제는 아닌듯 합니다. 델파이날개 1389 2006/07/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.