2013-04-09 2 views
2

방지 :내가 여기에 문제가 나쁜 필요 재귀

void DrawState(){ 
    char statevar[1000] = {0}; 
    //bla bla bla 
    something = showmenu(); // or showscreen() or showinput() 
    if(something){ 
     // change state 
     state = new_state; 
    }else{ 
     // return to previous state 
     state = return_state; 
    } 
    // draw new state here. 
    DrawState(); 
} 

I 때 상태 변경을 실행하려면이 기능이 필요합니다. 하지만 이렇게 재귀 적으로 쓰면 메모리가 너무 많이 소모되어 결국 시스템이 손상됩니다. 내가이 일을하지 않을 때 나는 외부에서 스스로를 부르는 법을 모른다.

누군가가 어떤 생각을 갖고 있습니까?

편집 : 이것은 플러그인과 같이 관리자 소프트웨어를 통해 실행되는 라이브러리입니다. 백그라운드 작업은이 구현으로도 작동해야합니다. 어쩌면이 일을 어떤 상황에서 실행해야 할 것입니다.

+3

국가는 어떻게 결국 끝나나요? 그것이 충돌하는 이유입니다. 계속 함수를 호출하면 끝이 없습니다. 'state'가 목표에 도달하면 어떤 종류의 수익이 필요합니다. – JonH

+0

'DrawState'를 재귀 적으로 쓰는 대신 오히려 * 콜백 * (옵저버 사용)처럼 사용하고자하는 것 같습니다. –

+0

시작시이 메서드를 입력하면 실행되는 동안 모든 상태를 처리합니다. 그것은 끝나지 않습니다. –

답변

2

원하는 것은 재귀와 관련이 없지만 단순히 콜백과 관련이있는 것 같습니다.

코드의 내용이 변경 될 때마다 코드를 실행해야 할 경우 Observer pattern을 구현하고 싶습니다. 간단한 C 구현은 모니터 된 데이터가 갱신 될 때 실행될 함수를 보유하기 위해 함수 포인터를 사용할 수 있습니다.

예를 들어, 업데이트 기능 분리 할 수 ​​...

void DrawState() { 
    // ... 
} 

를 그리고, 당신은

int (*updateDraw)() = DrawState 

그리고 수행에 대한 포인터를 유지 할 수

if (updated) { 
    // when updated 
    updateDraw() 
} 
+0

'DrawState()'내부에서 포인터 메서드를 호출하면 스택 맨 위에서 실행되는 것처럼 동작합니까? 부모'DrawState()'를 종료하고 다시 실행한다는 의미입니까? –

+0

업데이트가 DrawState 메서드 내부에있게되므로 updateDraw 함수 포인터를 호출해도 여전히 재귀를 의미합니다. 내 말은 첫 번째 코드 상자 안에 세 번째 코드 상자를 복사하는 것입니다. –

+0

@TahaPaksu는 updateDraw 함수를 사용하지 않도록 업데이트를 이동합니다. 여기서 재귀가 필요 없습니다. 일반적으로 이벤트는 이벤트에 응답하고 속성을 확인한 다음 올바른 핸들러를 적절하게 전달하는 무한 루프를가집니다. –

관련 문제