메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
WhiteAT2008.01.14 21:33

전에 문제가 되었던 것은 잘 해결이 되었나요^^?

크게 2가지 방법이 있습니다. (다른방법이 있다면 다른 방법을 사용하면 되겠죠?)
(예를 들어 함수 f1, f2,f3 함수 3개가 있다고 할때...)

1. 전역변수로 사용 (함수의 인자를 사용하지 않고)
int f1_timer;
int f2_timer;
int f3_timer;

void op_f1(){ if(f1_timer>0) return;   }
void op_f2(){ if(f2_timer>0) return;   }
void op_f3(){ if(f3_timer>0) return;   }

2. 전역변수로 사용 (함수의 인자로 전달)
void op_f1(&timer){ if(timer>0) return;   }
void op_f2(&timer){ if(timer>0) return;   }
void op_f3(&timer){ if(timer>0) return;   }


함수 인자로 포인터를 사용하는 이유는 함수 내에서도 전달된 인자값이 변경되기 때문입니다.
예를 들어 아래처럼 했을 때는 timer 값이 함수 내에서 timer 값이  변경되면, 함수내에서만 적용됩니다.
void op_f1(timer){ if(timer>0) return;   } 
그 이유 때문에 포인터를 사용하는 겁니다.





1번과 2번이 크게 차이가 없어 보이지만,  (비슷한 일을 할 경우)엄청난 차이가 있는 경우가 있습니다.
예를 들어, 키 8개 led 8개가 있고,  눌러진 키의 번호에 해당하는 LED 를 ON 하려고 할때

1번 방법으로 한다면.
void op_f1(){ if(f1_timer>0) return;  // led 처리 }
void op_f2(){ if(f2_timer>0) return; // led 처리 }
void op_f3(){ if(f3_timer>0) return;  // led 처리 }
void op_f4(){ if(f4_timer>0) return;  // led 처리 }
void op_f5(){ if(f5_timer>0) return;   // led 처리 }
void op_f6(){ if(f6_timer>0) return;   // led 처리 }
void op_f7(){ if(f7_timer>0) return;   // led 처리 }
void op_f8(){ if(f8_timer>0) return;   // led 처리 }
로 선언이 되고  메인에서는
op_f1();op_f2();op_f3();op_f4();op_f5();op_f6();op_f7();op_f8();
가 되겠죠?

2번 방법인 경우.
void op_f1(&timer) if( *timer>0) return;  // led 처리 }  // 하나의 함수만 선언하면 되고,
메인에서는
op_f1(&timer1);
op_f1(&timer2);
op_f1(&timer3);..................식으로 사용될 것입니다.


이 예제는 간단한 예제이지만 관련된 변수가 많아지고 op_f1내의 함수 기능이 많아지면, 수정하기와 디버깅 하는데 엄청난 차이가 생깁니다...


전달받은 인자가 함수내에서 값이 변경되고 또 그 값을 돌려 줘야 한다면 call-by-reference를 사용하거나  전역변수를 사용해야 하고,
인자값을 받아서 사용만 하려면 call-by-value 로 사용하면 됩니다.

전달인자의 크기가 작을 때는 call-by-reference 방식이 속도가 빠르지만 전달인자의 크기가 커지면 속도의 차이는 크지 않습니다.
그리고 call-by-reference는 주소공간을 줄인다는 장점이 있구요..

사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )