콜백 내에서 재귀?
글쓴이: sukjoony / 작성시간: 금, 2008/10/10 - 9:03오후
OpenGL을 glut를 이용해서 코딩하고 있습니다.
보니까 기본적으로 스스로 만든 함수를 glut 함수에 넣어서 콜백하는 원리던데,
책을 읽다가glutTimerFunc(int n, (void*)function, int v): n ms만큼의 주기로 function을 반복
이 함수를 사용한 부분에서 의문점이 생깁니다.
void foo() { ... glutTimerFunc(33, foo, 1); ... } int main() {... glutTimerFunc(33, foo, 1); ... }
이런 식으로 foo 내에서 glutTimerFunc를 호출해줘야
foo가 계속 반복된다고 이렇게 하라고 나와있네요.
근데 이렇게 되면 glutTimerFunc이 foo를 호출하고, 호출된 foo가 또 glutTimerFunc를 호출하고..
이런식으로 재귀 아닌 재귀가 무한히 발생하지 않나요?
이렇게 되면 어느 정도 계속 돌리게 되면 메모리 스택이 꽉 차서 뻗지 않나요? ㅠㅠ
제가 하나는 알고 열을 몰라서 이런 질문을 하는 거라면 저의 무지를 일깨워 주십시오 ;ㅁ;
아시는 분 답 부탁드려요 :)
Forums:
GL... 먼
GL... 먼 산...
glutTimerFunc() 가 timeout 시간을 갱신하는 역할만 한다면요 ?
OTL
그렇다면야..
스택에는 함수의 리턴 주소만 계속 쌓이게 되는 건가요 ? :)
이정도는 계속 늘어나도 무시할 수 있을 만 하다,, 이런 얘기겠군요!
이건 딱 예전의 unreliable signal 같네요.
glutTimerFunc()는 그 자체가 등록된 함수를 호출하지는 않습니다. 다만 timer 인터럽트에 대한 핸들러로 해당 함수를 등록할 뿐이기 때문에, glutTimerFunc()이 호출된다고 foo가 호출 되지는 않습니다. 지정된 시간이 지나야 호출되죠. 마치 이런 식인거 같네요.
main()
{
.....
signal(SIG_ARLM, foo);
alarm(10);
....
}
foo()
{
signal(SIG_ARM, foo);
alarm(10);
}
10초 주기로 foo를 실행하고, foo는 사라진 핸들러를 재등록합니다.(근데 이 코드가 맞는건가요;)
부연설명을 하자면....
어머니한테 내일 아침 6시에 깨워달라고 서른번 정도 부탁드린다고 어머니께서 하셔야 하는 일이 서른번으로 늘어나지는 않죠.
아하
이해가 되었습니다 :)
감사합니다!
저렇게 흔히 쓰는
저렇게 흔히 쓰는 용례를 찾아보자면 JavaScript의 setTimeout입니다. JS를 해보셨다면 이것도 이해가 빠르시겠군요. :)
한말글 프로그래밍 언어 "열정" http://me-lang.wo.tc
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기