2015-04-18 3 views
6

Я пытаюсь скомпилировать пример из Real World Haskell (глава 26):FFI: Как объявить `size_t`

Существует C функция Я хочу, чтобы позвонить с помощью 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 */ 

Вот код Haskell, который пытается импортировать:

{-# 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() 

Когда я пытаюсь скомпилировать его ghc дает следующее сообщение об ошибке:

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

Какой тип следует использовать для маршала size_t? Если я заменил CSize и воспользуюсь Word64, вместо этого он будет скомпилирован, но Word64 не переносится, правда?

ответ

8

Проблема в том, что вы импортировали CSize в качестве абстрактного типа. FFI допускает новые типы типов, такие как Word64, но только в том случае, если он действительно может видеть скрытые типы.

В вашем случае изменения соответствующего импорта строку

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

должен сделать трюк.

+2

И 7.10.1 дает лучшее сообщение об ошибке: «неприемлемый тип аргумента в иностранной декларации: „CSIZE“не может быть в сортируются, иностранного вызова , поскольку его данные construtor не в области видимости Возможные исправления: импорт данных в конструктор принесите его в сферу действия " –

+0

Это сделало это! Благодаря! – esato1981

Смежные вопросы