[GPG 1 글 3.0] 오타인듯 해서..

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

eoh
Posts: 135
Joined: 2001-07-20 09:00
Location: REAL:DREAM
Contact:

Post by eoh »

이 글은 예전 GPG 스터디 포럼에 님이 올리신 주제와 그에 대한 답글들입니다. 원본(Ezboard)은 "<a href="http://pub32.ezboard.com/fgpgstudyfrm4. ... D=27.topic" target="_blank">오타인듯 해서..</a>"입니다.
<div class="imported">
<div class="sep"><span class="cfs">제목: 오타인듯 해서..
</span></div>
<div class="r">글쓴이: , 글쓴때: 6/29/01 1:27:11 pm</div>

안녕하세요 GPG 재미있게 보고 있습니다..
305p에 오타인듯한 문장이 있어 올립니다.

#define State(a) if(0){ return (true); } }
else if (a ==state) { if(0) {

이라는 부분이 있는데 말이죠..
이렇게 바뀌어야 하는게 아닌가요?

#define State(a) return (true); }
else if (a ==state) {
그리고..
#define EndStateMachine 부분에는 하나가
잘못 들어간것 같네요.

혹.. 확인해 주실 분이 계시면 감사하겠습니다.
<p></p>
<div class="sep"><span class="cfs">제목: Re: 오타인듯 해서..
</span></div>
<div class="r">글쓴이: gryu , 글쓴때: 6/29/01 2:23:47 pm</div>

EndStateMachine의 else { assert( 앞의 는 잘못 들어간 것이 맞습니다. 잘못 들어갔다기 보다는 거기서 줄이 바뀌어야 한다는게 더 정확할 것 같네요(가독성 면에서..)

즉 이런 식으로요...

<pre>
#define EndStateMachine return( true ); } }
else { assert(
!"Invalid State" );
return( false );} return( false );
</pre>

OnUpdate도 마찬가지이구요. return( true ); } else if( 에서 중간의 를 제거하거나 그 바로 다음에서 줄을 바꿔야 할 것입니다.

그리고 if(0) 은 일종의 트릭인 것 같니다. 매크로를 잘못 사용하는 일이 없도록 하기 위한 보호 장치인 것 같네요.... 예를 들어서 State 다음에는 즉시 다른 매크로들(OnEnter, OnUpdate 등)이 와야 합니다.. 실제 코드가 오면 무시됩니다.

예를 들어서
<pre>
State(STATE_Roam)

printf("쿠쿠..."); //<-- 이것!

OnUdate

</pre>
이걸 실제로 확장하면..
<pre>
if(0) { return( true ); } }
else if( STATE_Roam == state ) { if(0) {

printf("쿠쿠..."); //무시됨.

return( true ); }
else if(
MSG_RESERVED_Update == msg->name ) {
</pre>

또한 디버깅을 위한 것일 수도 있구요.. 예를 들어서 매크로 정의에서 if(0)을 if(1)로 바꾸면 해당 부분은 무조건 true를 리턴하게 되므로 일일이 해당 코드를 주석 처리를 하지 않아도 특정 부분을 비활성화시킬 수 있다는..

CD의 fsmmacros.h도 참고해 보세요. 거기에는 BeginStateMachine에 if(0)이 포함되어 있구요(따라서 BeginStateMachine 다음의 C/C++ 코드는 무조건 무시됩니다). 반면 State의 제일 처음 if(0)은 빠져 있습니다... CD 것이 좀 더 깔끔한 듯 하네요..



<p><center>
/*************************
as simple as possible,
but not simpler
*************************/
</center>

<br></p>
<div class="sep"><span class="cfs">제목: 고맙습니다.. 근데..
</span></div>
<div class="r">글쓴이: , 글쓴때: 7/19/01 2:53:30 pm</div>

안녕하세요. 오랜만에 들어와 봤습니다.
답변 감사합니다. 시디에 있는 소스를 보니 다음과 같이 되어 있더군요.

#define BeginStateMachine if( STATE_Global == state ) { if(0) {
#define State(a) return( true ); } } else if( a == state ) { if(0) {
#define OnEnter return( true ); } else if( MSG_RESERVED_Enter == msg->name ) {
#define OnExit return( true ); } else if( MSG_RESERVED_Exit == msg->name ) {
#define OnUpdate return( true ); } else if( MSG_RESERVED_Update == msg->name ) {
#define OnMsg(a) return( true ); } else if( a == msg->name ) {
#define SetState(a) go->next_state = a; go->force_state_change = true;
#define EndStateMachine return( true ); } } else { assert( !"Invalid State" );
return( false );} return( false );

일단 줄바뀜을 표시하는 표시 두개가 오타인 듯 하고,
State(a) 매크로의 if(0){ 부분이 BeginStateMachine
매크로의 끝부분으로 가야 하는군요.
이렇게 맞춰놓으니까 매크로가 제대로 보입니다.

State(a) 매크로의 끝부분에 if(0){ 이 없다면 OnEnter나
OnMsg의 else if 항목과 연결되지 않겠네요.

실제로 어떻게 써먹을 수 있을지 모르겠지만
재미있는 매크로였습니다. ^^;

좋은 하루 되세요.


<p></p></div>