2015-04-18 27 views
6

Sto cercando di compilare un esempio tratto dalla Real World Haskell (capitolo 26):FFI: Come dichiarare `size_t`

c'è una funzione C voglio chiamare utilizzando FFI:

#include <stdint.h> 
#include <sys/types.h> 

/* only accepts uint32_t aligned arrays of uint32_t */ 
void hashword2(const uint32_t *key, /* array of uint32_t */ 
      size_t length,  /* number of uint32_t values */ 
      uint32_t *pc,   /* in: seed1, out: hash1 */ 
      uint32_t *pb);  /* in: seed2, out: hash2 */ 

Ecco il codice Haskell che cerca di importarla:

{-# LANGUAGE BangPatterns, ForeignFunctionInterface #-} 
import Data.Word (Word32, Word64) 
import Foreign.C.Types (CSize) 
import Foreign.Marshal.Utils (with) 
import Foreign.Ptr (Ptr, castPtr, plusPtr) 
import Foreign.Storable (Storable, peek, sizeOf) 

foreign import ccall unsafe "lookup3.h hashword2" hashWord2 
    :: Ptr Word32 -> CSize -> Ptr Word32 -> Ptr Word32 -> IO() 

Quando provo a compilarlo ghc dà il seguente messaggio di errore:

Unacceptable argument type in foreign declaration: CSize 
When checking declaration: 
    foreign import ccall unsafe "static lookup3.h hashword2" hashWord2 
    :: Ptr Word32 -> CSize -> Ptr Word32 -> Ptr Word32 -> IO() 

Che tipo dovrei usare per effettuare il marshalling di size_t? Se sostituisco CSize e utilizzo Word64 invece verrà compilato, ma Word64 non è portatile, giusto?

risposta

8

Il problema è che è stato importato CSize come tipo astratto. L'FFI consente versioni con tipi di nuovo tipo come Word64, ma solo se può effettivamente vedere i tipi contenuti.

Nel tuo caso, cambiando la linea di importazione appropriato per

import Foreign.C.Types (CSize(..)) 

dovrebbe fare il trucco.

+2

E 7.10.1 dà un messaggio di errore più: "Inaccettabile tipo di argomento nella dichiarazione estera: 'CSize' non può essere schierato in una chiamata estera perché la sua construtor dati non sono di portata correzione possibile: importare il costruttore di dati portalo nel campo di applicazione " –

+0

Questo l'ha fatto! Grazie! – esato1981