main()
while(1) {
Operating_rtn(&outmode);
}
void Operating_rtn(?) {
timer--;
각 구조체 변수 = 값;
}
이런 식으로 된다고 할때,, ? 물음표에 구조체 또는 구조체 변수 등이 올 수 있는 것인가요?
이거 좀 자세히 간단한 예제랑 설명 좀 해주시거나, 자료 좀 주시면 고맙겠습니다.
이걸 꼭 사용해야 하거든요..
메인 루틴에서 output 변수와 각종 출력 변수를 쓰고, operatin_rtn에서 그 값들을 일률적으로 한번에 출력하려고
합니다.
근데, 일반적으로 이렇게 call by reference 가 속도가 늦은데, 굳이 이 방법을 사용해야 하는지..
그냥. Operating_rtn(volatile 지역변수) 로 받으면 안되는지.. 잘 모르니 그리 의심이 됩니다.
while(1) {
Operating_rtn(&outmode);
}
void Operating_rtn(?) {
timer--;
각 구조체 변수 = 값;
}
이런 식으로 된다고 할때,, ? 물음표에 구조체 또는 구조체 변수 등이 올 수 있는 것인가요?
이거 좀 자세히 간단한 예제랑 설명 좀 해주시거나, 자료 좀 주시면 고맙겠습니다.
이걸 꼭 사용해야 하거든요..
메인 루틴에서 output 변수와 각종 출력 변수를 쓰고, operatin_rtn에서 그 값들을 일률적으로 한번에 출력하려고
합니다.
근데, 일반적으로 이렇게 call by reference 가 속도가 늦은데, 굳이 이 방법을 사용해야 하는지..
그냥. Operating_rtn(volatile 지역변수) 로 받으면 안되는지.. 잘 모르니 그리 의심이 됩니다.
전에 문제가 되었던 것은 잘 해결이 되었나요^^?
크게 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는 주소공간을 줄인다는 장점이 있구요..