2012-06-05 44 views
10

當然,答案是以某種方式傳遞/獲取連續的記憶塊,所以問題更多的是如何做到這一點。現在我仍然可以通過在C端編寫包裝函數來避免這個問題,但這不是什麼太多的permament解決方案。Haskell FFI - 如何處理接受或返回結構的C函數而不是指向結構體的指針?

+0

你在找什麼像[this](http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs)。 –

+0

只是爲了確認:你想通過值傳遞結構,而不是引用? –

+0

@Don是的,這是正確的。 – Cubic

回答

12

FFI不支持按值Haskell存儲類型進行任意傳遞。

只能傳遞類型的值(和一些這些都是指針):

Int#, Word#, 
Char#, 
Float#, Double#, 
Addr#, 
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#. 

所以,傳遞,必須用通過C包裝通話的結構;它接受一個指針並將其值傳遞給您希望實際調用的C函數。

最近的GHC擴展允許「primop」導入 - 它繞過FFI機制並支持任意調用約定並通過未裝箱的元組傳遞結構。例如。

foreign import prim "ITCHv41_run" 
    parseITCHv41# :: Addr# -> Word# 
       -> (# Int#, Word#, Word#, Word#, Word#, Word# #) 

你可以用這些來做tricky low level stuff這樣。

+3

感謝您鏈接該博客 - 它有很多非常有用的東西。 – Crashworks