Structs에서 Haskell의 FFI를 어떻게 사용합니까?
문제
이미지를 읽기 위해 다음 C 라이브러리를 만들었습니다.
typedef struct {
unsigned int height;
unsigned int width;
unsigned char* red; //length=height*width
unsigned char* green;
unsigned char* blue;
} Contents;
Contents readJPEGFile(const char* inFilename);
외부 기능 인터페이스와 함께 배열 및 스트러크를 사용하여 정보를 찾을 수 없습니다. Haskell에서 내 라이브러리를 어떻게 사용할 수 있습니까?
다음 예제를 기본으로 사용하려고했습니다. http://therning.org/magnus/archives/315 그러나 HSC 파일은 위의 C 코드 만 포함 된 HS 파일로 컴파일되었으며 더 이상 아무것도 컴파일 할 수 없습니다.
해결책
마치 빌드 문제가있는 것처럼 들립니다. 나는 Windows Win32 DDEML 라이브러리에 FFI 인터페이스를 작성할 때 예를 들어 참조하는 바로 그 페이지를 사용했음을 기억하는 것 같습니다. 예를 들어, 우리가 사용하는 구조 중 하나는
typedef struct tagHSZPAIR {
HSZ hszSvc;
HSZ hszTopic;
} HSZPAIR, *PHSZPAIR;
#include "ddeml.h"
이것을 가져옵니다 DDEML.hsc
파일. 우리는 다음과 같이 액세스합니다.
data HSZPair = HSZPair HSZ HSZ instance Storable HSZPair where sizeOf _ = (#size HSZPAIR) alignment = sizeOf peek ptr = do svc <- (#peek HSZPAIR, hszSvc) ptr topic <- (#peek HSZPAIR, hszTopic) ptr return $ HSZPair svc topic poke ptr (HSZPair svc topic) = do (#poke HSZPAIR, hszSvc) ptr svc (#poke HSZPAIR, hszTopic) ptr topic
불행히도, 나는 Windows 상자가 편리하지 않기 때문에 현재이 컴파일이 무엇인지 보여줄 수는 없지만 생성 된 코드는 위와 같습니다. #size HSZPAIR
대체 (64)
또는 무엇이든.
(실제로 생성 된 내용을보고 싶거나 빌드를 수행하는 데 도움이 필요하면 저에게 이메일을 보내 주시면 도와 드리겠습니다.)
다른 팁
기본 FFI 지원에는 스칼라 유형 만 포함됩니다. 주소 산술로 당신이하는 다른 모든 것. 그만큼 외국 유형에 관한 섹션 FFI 문서에서는 기본 사항을 제공하며 예제를 찾을 수 있습니다. FFI 요리 책.
한 번에 당신은 같은 도구를 사용할 수 있습니다 그린 카드 그리고 H/Direct 마샬링 및 비 모성 코드를 생성합니다. 내가 이해하지 못하는 이유 때문에이 도구는 오랫동안 업데이트되지 않았습니다. 내가 선택한 현재 도구를 알 수있는 한 hsc2hs
.
편집 : 의견에 언급 된대로 (Ephemient에게 감사합니다), c2hs
또한 인기가 있으며 그 이후로 c2hs
Manuel Chakravarty 출신입니다.
Hackage에는 FFI를 사용하는 여러 패키지가 있습니다 예제를 볼 수 있습니다.