2009-03-21 18 views
15

que han creado la siguiente biblioteca de C para la lectura de una imagen:¿Cómo uso el FFI de Haskell en las estructuras?

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

Realmente no se puede encontrar ninguna información utilizando matrices y estructuras con la interfaz para funciones de Asuntos Exteriores. ¿Cómo procedo a poder usar mi biblioteca en Haskell?

He intentado utilizar el siguiente ejemplo como base: http://therning.org/magnus/archives/315 pero entonces el archivo de HSC fue compilado a un archivo hs que sólo contenía el anterior código C y nada más (y por supuesto que no puede ser compilado) .

Respuesta

5

Parece que tiene un problema de compilación; Me parece recordar que utilicé la página que hace referencia como ejemplo cuando estaba escribiendo una interfaz FFI en la biblioteca DDEML de Windows Win32. Por ejemplo, una de las estructuras que utilizamos es

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

#include "ddeml.h" trae esto en el fichero de DDEML.hsc. Accedemos 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 

Por desgracia, no se puede mostrar lo que este compila a en este momento porque no tengo una caja práctica de Windows, pero el código generado fue tan arriba, excepto con #size HSZPAIR reemplazado con (64) o lo que sea, etc.

(Si realmente quiere ver lo que se ha generado, o necesita ayuda para hacer su construcción, e-mail me y te ayudaré a salir.)

9

El soporte básico de FFI incluye solo tipos escalares. Todo lo demás terminas haciendo con la aritmética de direcciones. El section on foreign types en la documentación de FFI proporciona los conceptos básicos, y puede encontrar un ejemplo en el FFI Cookbook.

Hubo un tiempo en que podías usar herramientas como Green Card y H/Direct para generar un código de ordenación y eliminación de conflictos para ti. Por razones que no entiendo, estas herramientas no se han actualizado en mucho tiempo. Por lo que puedo decir, la herramienta actual de elección es hsc2hs.


Editar: Como se señaló en el comentario (gracias ephemient), c2hs es también muy popular, y desde c2hs es de Manuel Chakravarty es probable que sea buena.

+2

He usado c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/) en el pasado, que es (a) mantenido y (b) más fácil que hsc2hs, en mi opinión. – ephemient

+0

c2hs es una buena herramienta, pero no puede administrar enumeraciones o uniones – ChrisQuignon

+0

También hay 'c2hsc', para producir archivos hsc mayormente automáticamente desde archivos de encabezado C. –

Cuestiones relacionadas