2009-03-21 20 views
15

Tôi đã tạo ra các thư viện C sau để đọc một hình ảnh:Làm cách nào để sử dụng FFI của Haskell trên các cấu trú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); 

tôi có thể không thực sự tìm thấy bất kỳ thông tin sử dụng mảng và cấu trúc với giao diện chức năng nước ngoài. Tôi làm cách nào để tiếp tục sử dụng thư viện của mình trong Haskell?

Tôi cố gắng sử dụng ví dụ sau làm cơ sở: http://therning.org/magnus/archives/315 nhưng sau đó tệp hsc được biên dịch thành tệp hs chỉ chứa mã c ở trên và không có gì khác (và tất nhiên nó không thể được biên dịch) .

Trả lời

5

Có vẻ như bạn có vấn đề về xây dựng; Tôi dường như nhớ lại rằng tôi đã sử dụng trang rất bạn tham chiếu như là một ví dụ khi tôi đã viết một giao diện FFI vào thư viện Windows Win32 DDEML. Ví dụ, một trong những công trình chúng tôi sử dụng là

typedef struct tagHSZPAIR { 
    HSZ  hszSvc; 
    HSZ  hszTopic; 
} HSZPAIR, *PHSZPAIR; 

#include "ddeml.h" mang này vào tập tin DDEML.hsc. Chúng tôi tiếp cận nó với:

 
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 

Thật không may, tôi không thể hiển thị cho bạn những gì này biên dịch để vào lúc này bởi vì tôi không có một máy tính Windows, tiện dụng, nhưng các mã được tạo chỉ như trên, trừ trường hợp được #size HSZPAIR thay thế bằng (64) hoặc bất kỳ thứ gì và vân vân.

(Nếu bạn thực sự muốn nhìn thấy những gì được tạo ra, hoặc cần giúp đỡ làm xây dựng của bạn, e-mail cho tôi và tôi sẽ giúp bạn ra ngoài.)

9

Hỗ trợ FFI cơ bản chỉ bao gồm các loại vô hướng. Tất cả mọi thứ khác bạn gió lên làm với số học địa chỉ. section on foreign types trong tài liệu FFI cung cấp thông tin cơ bản và bạn có thể tìm thấy ví dụ trong FFI Cookbook.

Đồng thời bạn có thể sử dụng các công cụ như Green CardH/Direct để tạo mã marshalling và unmarshalling cho bạn. Vì những lý do tôi không hiểu, những công cụ này chưa được cập nhật trong một thời gian dài. Theo như tôi có thể nói công cụ hiện tại của sự lựa chọn là hsc2hs.


Edit: Như đã nêu trong bình luận (nhờ ephemient), c2hs cũng rất phổ biến, và kể từ c2hs là từ Manuel Chakravarty nó có khả năng là tốt.

+2

Tôi đã sử dụng c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/) trong quá khứ, đó là (a) vẫn được duy trì và (b) dễ dàng hơn hsc2hs, trong ý kiến. – ephemient

+0

c2hs là một công cụ tốt, nhưng không thể quản lý enums hoặc unions – ChrisQuignon

+0

Ngoài ra còn có 'c2hsc', để tạo các tệp hsc chủ yếu tự động từ các tệp tiêu đề C. –

Các vấn đề liên quan