2009-03-21 17 views
15

Ben bir görüntüyü okumak için aşağıdaki C kütüphanesini oluşturduk:Haskell'in FFI'sini yapılarda nasıl kullanırım?

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

Gerçekten Yabancı Fonksiyon Arayüzü ile diziler ve yapılar kullanarak herhangi bir bilgi bulamıyorum. Kitaplığımı Haskell'de nasıl kullanabileceğim?

Aşağıdaki örneği bir temel olarak kullanmayı denedim: http://therning.org/magnus/archives/315 Ancak hsc dosyası, yalnızca yukarıdaki c kodunu içeren ve daha fazla bir şey içermeyen bir hs dosyasına derlendi (ve elbette derlenemez). . Örneklere bakabileceğiniz

cevap

5

Bir derleme sorununuz varmış gibi geliyor; Windows Win32 DDEML kitaplığına bir FFI arabirimi yazarken örnek olarak başvurduğunuz sayfayı kullandığımı hatırlıyorum. Örneğin, kullandığımız yapılarından biri

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

#include "ddeml.h"DDEML.hsc dosyaya bu getiriyor olduğunu. Biz bunu erişmek: Maalesef

 
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 

, ben kullanışlı kutu bir Windows'u yok çünkü şu anda derler ne gösteremez, ancak üretilen kod #size HSZPAIR hariç, yukarıdaki gibi sadece oldu (64) ile değiştirilir ya da her neyse. Eğer sadece bir kaçı olsaydı

(gerçekten oluşturulan görmek istiyorum veya yapı yapıyor yardım gerekiyorsa, e-mail me ve ben size yardım edeceğiz.)

9

Temel FFI desteği yalnızca skaler türleri içerir. Adres aritmetiği ile uğraştığın her şey. FFI belgelerindeki section on foreign types temelleri verir ve FFI Cookbook'da bir örnek bulabilirsiniz.

Bir kerede, sizin için marshalling ve unmarshalling kodu oluşturmak için Green Card ve H/Direct gibi araçları kullanabilirsiniz. Anlamadığım nedenlerden dolayı, bu araçlar uzun bir süredir güncellenmedi. Mevcut seçim aracının hsc2hs olduğunu söyleyebilirim.


Düzenleme: comment (teşekkürler ephemient) 'de belirtildiği gibi, c2hs da popülerdir ve c2hs Manuel Chakravarty dan beri iyi olması muhtemeldir.

+2

Geçmişte c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/) kullanıyorum, (a) hala devam ediyor ve (b) hsc2hs'den daha kolay görüş. – ephemient

+0

c2hs güzel bir araçtır, ancak ener veya sendikaları yönetemiyor – ChrisQuignon

+0

Ayrıca c başlık dosyalarını çoğunlukla otomatik olarak hsc dosyaları üretmek için c2hsc' vardır. –