2012-02-27 29 views
7

Tôi có chức năng trả về vector<MyClass>; cách tốt nhất để thay đổi điều này thành một cái gì đó phù hợp với FFI là gì?Haskell FFI: Làm thế nào để bạn gói các bộ sưu tập C++?

Tôi đang nghĩ một loại như :: [CIntPointer] có thể là một thỏa hiệp tốt đẹp, nếu có thể có được.

+0

Bạn có cần phải sửa đổi các yếu tố cá nhân ở phía bên Haskell? –

+0

@JohnL, không, chỉ cần gọi các chức năng với chúng, ví dụ: 'do {a <- cpp_getVector(); forM a cpp_f} 'where' cpp_f :: ElementType -> IO() ' – gatoatigrado

Trả lời

3

Bạn có thể xác định các hàm C của riêng mình để cấp phát, miễn phí, chèn, xóa, v.v. Các chức năng này có thể bọc vùng chứa C++ mà bạn muốn truy cập. Ví dụ:

extern "C" { 

Obj * obj_create() 
{ 
    return new Obj(); 
} 

void obj_destroy(Obj * schema) 
{ 
    delete obj; 
    obj = NULL; 
} 
... 
... 
} 

sau đó khai báo trong FFI và bọc chúng theo bất kỳ cách nào bạn muốn.

data SomeObject 

type Obj = Ptr SomeObject 

foreign import ccall unsafe "obj_create" 
    createObj :: IO Obj 

foreign import ccall unsafe "obj_destroy" 
    destroyObj_ :: Obj -> IO() 

foreign import ccall unsafe "&obj_destroy" 
    destroyObj :: FunPtr (Obj -> IO()) 

Một số vấn đề:

  1. Hãy chắc chắn rằng bạn biên dịch các tập tin C với C++ biên dịch (g ++ thay vì gcc). điều này sẽ đảm bảo rằng các stdC++ libs được chọn chính xác.
  2. Vượt qua những địa điểm thư viện (-L) và libs (-lboost *) để liên kết trong khi biên dịch chương trình/lib ở phía Haskell
+0

Vâng, đó là khá nhiều những gì tôi đang làm ... cảm ơn mặc dù. – gatoatigrado

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