2016년 6월 26일 일요일

중첩 루프에서 탈출하기


C언에서 loop가 중첩되는 경우 일반적으로 break를 여러번 사용해야 합니다.
하지만 다른 방법도 있긴 한데 setjmp를 이용하는 방법입니다.
아래 예제를 보면 이해가 쉬울 수 있는데,
원리는 setjmp로 마킹했는 지점의 stack을 저장해두었다가 복원 하는 방식입니다.
따라서 호출되는 위치는 자신이 거처온 지점중에 하나가 되게 됩니다.
longjmp시 뒤에 인자는 setjmp의 인자값으로 가지고 돌아갑니다.

하지만 이러한 방법은 거의 사용되는 경우를 보지 못했습니다.
이런게 있다는 정도만 기억하면 될 것 같습니다.



Cpasted just now: 
#include <stdio.h>
#include <setjmp.h>
jmp_buf savejmp;
int a;
int loop()
{
 for(;;){
  for(;;){
   for(;;){
    a++;
    if( a==100 )
     longjmp(savejmp, 1);
   }
  }
 }
}

int main()
{
 // setjmp 최초 실행시 0을 반환, longjmp 에서 호출될때 두번째 인자값 반환
 if( setjmp(savejmp)==0 ){
  // 최초 실행
  printf("Hello world\n");
  loop();
  // 리턴안됨 여기로 오면 무한루프
  printf("endless\n");
  for(;;); 
 }else{
  printf("end %d\n",a);
 }
 return 0;
}


Output:
1
2
Hello world
end 100






댓글 없음:

댓글 쓰기