當然,答案是以某種方式傳遞/獲取連續的記憶塊,所以問題更多的是如何做到這一點。現在我仍然可以通過在C端編寫包裝函數來避免這個問題,但這不是什麼太多的permament解決方案。Haskell FFI - 如何處理接受或返回結構的C函數而不是指向結構體的指針?
10
A
回答
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
相關問題
- 1. 返回指向結構體的指針
- 2. C++返回指向函數結構的指針
- 3. 如何處理返回指向結構體的指針的方法?
- 4. 調用返回(並接受)指向結構的指針的本地DLL函數
- 5. 結構體數組與指向結構體的指針數組
- 6. 設置指向結構的指針等於指向函數返回的結構的另一個指針?
- 7. C通過指針返回結構體
- 8. 如何將C指針指向C#數組的結構體
- 9. 如何從函數中的數組返回結構體? (指針)
- 10. 不同結構類型指針指向指針結構指針
- 11. 從函數返回指向結構的指針
- 12. C++返回模板類中的受保護結構體指針
- 13. 如何創建指向結構體的指針數組? C++
- 14. 函數返回指針結構
- 15. 結構中的指針指向結構的動態數組C
- 16. 將結構(指向結構?的指針?)傳遞給函數
- 17. 指向結構函數指針的函數指針
- 18. 指向不同結構內結構的指針。 C
- 19. 指向結構的指針
- 20. 指向結構的指針
- 21. 指向結構體的指針陣列
- 22. 處理C中結構的指針#
- 23. 指向c中的結構的指針
- 24. 返回結構數組或結構指針數組?
- 25. 釋放指向其他結構的結構體中的指針
- 26. 引用指向結構的指針,該結構包含指向結構的指針的指針
- 27. C++指向結構的指針陣列
- 28. C++:無法返回指向結構的指針
- 29. 指向結構指針的指針
- 30. 指向結構指針的指針
你在找什麼像[this](http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs)。 –
只是爲了確認:你想通過值傳遞結構,而不是引用? –
@Don是的,這是正確的。 – Cubic