2009-03-21 12 views
15

나는 이미지를 읽기 위해 다음과 같은 C 라이브러리를 만들었습니다하스켈의 FFI를 구조체에 어떻게 사용합니까?

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); 

은 정말 외국인 함수 인터페이스와 배열과 구조체를 사용하는 모든 정보를 찾을 수 없습니다. 하스켈에서 내 도서관을 사용하려면 어떻게해야합니까?

다음 예제를 기본으로 사용하려고 시도했습니다. http://therning.org/magnus/archives/315하지만 hsc 파일은 위의 C 코드 만 포함 된 hs 파일로 컴파일되었습니다 (물론 컴파일 할 수 없습니다) .

답변

5

빌드 문제가있는 것 같습니다. 필자는 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 

, 나는 내가 편리한 상자 윈도우가 없기 때문에이 순간에 컴파일 무엇을 보여줄 수는 없지만, 생성 된 코드는 #size HSZPAIR를 제외하고 위와 불과했다 (64) 또는 기타 등등으로 대체되었습니다. 당신은 몇 가지 언급 할 수 있다면

(당신이 정말로 생성 된 것을보고 싶어하거나 빌드를 수행하는 데 도움이 필요하면 나에게 이메일 보내기 내가 당신을 도울 수 있습니다.)

9

기본 FFI 지원에는 스칼라 유형 만 포함됩니다. 그 밖의 다른 모든 것들은 주소 산술 연산을 수행합니다. FFI 설명서의 section on foreign types은 기본을 제공하며 FFI Cookbook에서 예를 찾을 수 있습니다.

한 번에 Green CardH/Direct 같은 도구를 사용하여 마샬링 및 마샬링 코드를 생성 할 수 있습니다. 이해할 수없는 이유로,이 도구는 오랫동안 업데이트되지 않았습니다. 현재 내가 선택한 도구는 hsc2hs입니다.


편집 : 주석 (감사 ephemient)에서 언급 한 바와 같이, c2hs도 인기가 c2hs 마누엘 Chakravarty에서이기 때문에 잘 될 가능성이 높습니다.

+2

나는 과거에 c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/)를 사용했는데, 이는 (a) 여전히 유지되고 (b) hsc2hs보다 쉽다. 의견. – ephemient

+0

c2hs는 좋은 도구이지만 열거 형 또는 공용체를 관리 할 수 ​​없습니다. – ChrisQuignon

+0

C 헤더 파일에서 대부분 자동으로 hsc 파일을 생성하는 'c2hsc'도 있습니다. –