2012-06-05 33 views
10

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?

+0

Bạn đang tìm kiếm một cái gì đó như [this] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –

+0

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? –

+0

@Don yes, đúng vậy. – Cubic

Trả lời

12

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.

+3

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

Các vấn đề liên quan