2012-06-08 10 views
3

특히 Allegro 게임 라이브러리에 바인딩을 작성하여 Haskell의 외부 함수 인터페이스를 배우려고합니다. EventQueue가 불투명에 대한 포인터입니다하스켈에서 C 구조체를 어떻게 할당하고 재사용 할 수 있습니까?

foreign import ccall "allegro5/allegro.h al_get_next_event" 
    alGetNextEvent :: EventQueue -> Ptr (Event) -> IO (CInt) 

: GHC 및 hsc2hs를 사용

// initialize event struct 
ALLEGRO_EVENT event; 

// main loop 
while (running) { 
    if (al_get_next_event(event_queue, &event)) { 
     // process event here ... 
    } 
} 

, 나는 같은 외국 함수 호출을 쓸 수 있습니다 : 알레그로의 기본 C에서 메인 이벤트 루프는 다음과 같이 보입니다 구조이고 Event은 C의 ALLEGRO_EVENT을 기반으로 한 Storable 인스턴스입니다.

이상적으로는, 사용자가 직면 하스켈 기능을 위해, 나는 멀리 ALLEGRO_EVENT 구조체 및 부울 반환 값을 추상적 초기화하는 것

getNextEvent :: EventQueue -> Maybe Event 

같은 유형 서명을하고 싶습니다.

제 질문은 메모리 효율성을 극대화하기 위해이 함수를 어떻게 작성해야합니까? 메서드 내에서 Event에 대한 새 포인터를 malloc하여 사용할 수 있지만 C 기반 데이터로 작업 중이므로 기존 공간을 다시 사용하고 지속적으로 새 구조체를 할당하지 않도록하고 싶습니다. 또한 malloc 구조체를 사용하지 않고 모든 호출에 전달하지 않으려합니다.

어떤 조언이 필요합니까? 이 데이터를 로컬 범위가 지정된 경우 데이터가 더 이상 범위에있는 경우

+0

일부 바인딩은 https://github.com/chrra/allegro-raw입니다. 유용할지 모르겠다. – Matthew

답변

3

일반적으로, 당신은 mallocForeignPtr

  • ,

    을 사용 좋은 선택 매우 빠르기 때문에 파이널 라이저를 부착 할 수 있으며 스스로 정리할 필요가 없습니다.

    GHC 런타임은 공간을 최대로 재사용하기 때문에 효율적으로 사용할 필요가 없습니다. 가변 메모리 버퍼를 제자리에 고정합니다. GC가 일을 처리하게하십시오.