Я пытаюсь скомпилировать пример из 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
не переносится, правда?
И 7.10.1 дает лучшее сообщение об ошибке: «неприемлемый тип аргумента в иностранной декларации: „CSIZE“не может быть в сортируются, иностранного вызова , поскольку его данные construtor не в области видимости Возможные исправления: импорт данных в конструктор принесите его в сферу действия " –
Это сделало это! Благодаря! – esato1981