Tất nhiên câu trả lời là bằng cách nào đó vượt qua/lấy một khối bộ nhớ liền kề, vì vậy câu hỏi là nhiều hơn về cách thực hiện điều đó. Bây giờ tôi vẫn có thể tránh được vấn đề bằng cách viết các hàm wrapper ở phía C, nhưng đó không phải là giải pháp tính toán nhiều.Haskell FFI - Cách xử lý các hàm C chấp nhận hoặc trả về cấu trúc thay vì các con trỏ tới cấu trúc?
Haskell FFI - Cách xử lý các hàm C chấp nhận hoặc trả về cấu trúc thay vì các con trỏ tới cấu trúc?
Trả lời
FFI không hỗ trợ chuyển tùy ý theo giá trị loại lưu trữ Haskell.
Bạn chỉ có thể vượt qua giá trị của loại hình (và một số trong số này là con trỏ):
Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.
Vì vậy, để vượt qua một cấu trúc bạn phải quấn các cuộc gọi thông qua một wrapper C; có một con trỏ và chuyển giá trị của nó đến hàm C mà bạn muốn thực sự gọi.
Một phần mở rộng GHC gần đây cho phép nhập "primop" - bỏ qua cơ chế FFI và hỗ trợ các quy ước gọi điện tùy ý và các cấu trúc truyền qua các bộ dữ liệu không có hộp. Ví dụ.
foreign import prim "ITCHv41_run"
parseITCHv41# :: Addr# -> Word#
-> (# Int#, Word#, Word#, Word#, Word#, Word# #)
Bạn có thể sử dụng chúng để làm tricky low level stuff như thế này.
Cảm ơn bạn đã liên kết blog đó - nó có rất nhiều nội dung thực sự hữu ích. – Crashworks
- 1. con trỏ trỏ tới mảng cấu trúc
- 2. trả về một mảng các cấu trúc hoặc một mảng các con trỏ struct?
- 3. Cấu trúc trả về từ hàm (C)
- 4. Sự hỗn loạn và Con trỏ tới các Cấu trúc
- 5. Làm cách nào để tôi sắp xếp cấu trúc dưới dạng con trỏ tới cấu trúc?
- 6. Chuyển con trỏ cấu trúc đến hàm trong c
- 7. C++ Câu hỏi con trỏ cấu trúc
- 8. P/gọi hàm lấy con trỏ đến cấu trúc
- 9. C/C++: Con trỏ trong cấu trúc Const
- 10. Việc xóa con trỏ của cấu trúc cũng sẽ xóa con trỏ trong cấu trúc?
- 11. C# vs VB.NET - Xử lý các cấu trúc rỗng
- 12. Con trỏ không có dấu vết cho các con trỏ cấu trúc trong C
- 13. Mảng động của con trỏ tới cấu trúc
- 14. Làm cách nào để đọc cấu trúc con trỏ C++?
- 15. Truyền các cấu trúc đến các hàm
- 16. Làm cách nào để làm việc với con trỏ tới con trỏ tới cấu trúc trong C?
- 17. Làm cách nào để sử dụng FFI của Haskell trên các cấu trúc?
- 18. con trỏ đến hàm, cấu trúc như tham số
- 19. Tốc độ dereferencing C cấu trúc con trỏ
- 20. Chuyển con trỏ/tham chiếu đến cấu trúc thành các hàm
- 21. Làm thế nào để trả về một con trỏ đến một cấu trúc trong ctypes?
- 22. C - khởi tạo mảng các cấu trúc
- 23. Chuyển con trỏ cấu trúc C sang tập lệnh lua
- 24. C# quản lý các chuỗi trong cấu trúc
- 25. Trả về con trỏ từ hàm C
- 26. Cấu trúc khởi tạo con trỏ trong C#
- 27. C typedef của con trỏ đến cấu trúc
- 28. C# gọi hàm C trả về cấu trúc với mảng char có kích thước cố định
- 29. Xử lý bộ nhớ với cấu trúc epoll_event
- 30. Con trỏ trỏ tới một cấu trúc mà chưa được công bố
Bạn đang tìm kiếm một cái gì đó như [this] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –
Chỉ cần xác nhận: bạn muốn chuyển cấu trúc theo giá trị, không phải tham chiếu? –
@Don yes, đúng vậy. – Cubic