2009-03-21 13 views
15

Ho creato la seguente libreria C per la lettura di un'immagine:Come utilizzare l'FFI di Haskell nelle strutture?

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

non riesco davvero a trovare alcuna info usando array e le strutture con l'interfaccia funzione degli Esteri. Come procedere per poter utilizzare la mia libreria in Haskell?

Ho provato a utilizzare il seguente esempio come base: http://therning.org/magnus/archives/315 ma il file hsc è stato compilato in un file hs che conteneva solo il c-code sopra e niente di più (e ovviamente non può essere compilato) .

risposta

5

Sembra che si tratti di un problema di build; Mi sembra di ricordare che ho usato la stessa pagina di riferimento come esempio quando stavo scrivendo un'interfaccia FFI nella libreria DDEML Windows Win32. Ad esempio, una delle strutture che usiamo è

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

#include "ddeml.h" porta questo al file DDEML.hsc. Accediamo con:

 
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 

Purtroppo, non si può mostrare ciò che questa compila per in questo momento perché non ho a portata di mano un box di Windows, ma il codice generato era proprio come in precedenza, se non con #size HSZPAIR sostituito con (64) o altro e così via.

(Se si vuole veramente vedere quello che è stato generato, o hai bisogno di aiuto fare la vostra costruzione, e-mail me e io ti aiuto fuori.)

9

Il supporto FFI di base include solo i tipi scalari. Tutto il resto che finisci con l'aritmetica degli indirizzi. Lo section on foreign types nella documentazione FFI fornisce le nozioni di base e puoi trovare un esempio nello FFI Cookbook.

Una volta è possibile utilizzare strumenti come Green Card e H/Direct per generare il marshalling e il codice di annullamento della memoria. Per ragioni che non capisco, questi strumenti non sono stati aggiornati da molto tempo. Per quanto posso dire lo strumento attuale di scelta è hsc2hs.


Edit: Come notato nel commento (grazie ephemient), c2hs è anche popolare, e dal momento che c2hs da Manuel Chakravarty è probabile che essere buono.

+2

Ho usato c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/) in passato, che è (a) ancora mantenuto e (b) più facile di hsc2hs, nel mio opinione. – ephemient

+0

c2hs è uno strumento piacevole, ma non è in grado di gestire enumerazioni o unioni – ChrisQuignon

+0

C'è anche 'c2hsc', per la produzione di file hsc in gran parte automaticamente da file di intestazione C. –

Problemi correlati