특히 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 구조체를 사용하지 않고 모든 호출에 전달하지 않으려합니다.
어떤 조언이 필요합니까? 이 데이터를 로컬 범위가 지정된 경우 데이터가 더 이상 범위에있는 경우
일부 바인딩은 https://github.com/chrra/allegro-raw입니다. 유용할지 모르겠다. – Matthew