我正在嘗試爲C庫創建一個Haskell包裝器。底層結構太複雜,不能用明確的類型來表示,除了在C函數之間傳遞外,我實際上並沒有使用它們,所以我使用了EmptyDataDecls
來讓GHC爲我解決這個問題。可存儲的空數據聲明
我需要的是指向其中一種數據類型的指針,但是當我嘗試使用alloca
創建一個指針時,它抱怨數據不是Storable
類型。例如:
{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
module Main where
import Foreign.Marshal.Alloc
import Foreign.Ptr
data Struct
foreign import ccall "header.h get_struct"
get_struct :: Ptr Struct -> IO()
main = alloca $ \ptr -> get_struct ptr
GHC不會編譯這個,說沒有Storable Struct
的實例。我可以實現它自己:
instance Storable Struct where
sizeOf _ = ...
alignment _ = ...
但是,接近擊敗目的 - 我不希望有這樣的定義的東西,如果我不關心什麼是在結構中。
我注意到指針指針工作正常,因爲Ptr
類是Storable
。因此,我可以完成我打電話get_struct
之前ptr
目標是通過使用peek
:
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr
這感覺就像一個黑客,但。
有沒有辦法讓空數據聲明被認爲是Storable
沒有定義實例?
這是一個破解。你永遠不會爲內部指針分配空間;你只是指着隨機記憶。這種方式存在段錯誤。 – 2011-01-25 15:39:21
所以如果我合法地想要一個指針指針,我應該使用兩個`alloca`調用,然後`戳一個指針到另一個,對吧? – zmthy 2011-01-25 22:59:26