Tôi đang gặp một số sự cố khi tạo trình bao bọc Python xung quanh thư viện C++ sử dụng SWIG (phiên bản 3.0.6).Làm thế nào để áp dụng các kiểu chữ SWIG OUTPUT cho các kiểu lớp trong Python?
Vấn đề của tôi liên quan đến việc áp dụng kiểu chữ OUTPUT, cụ thể trong trường hợp con trỏ/tham chiếu đến các loại lớp.
Để minh họa, đây là những gì tôi muốn với nhiều loại tiêu chuẩn, và nó hoạt động:
// .h
int add(const long arg1,const long arg2,long& resultLong);
// interface.i
%apply long& OUTPUT { long& resultLong };
int add(const long arg1,const long arg2,long& resultLong);
// projectWrapper.py
def add(arg1, arg2):
return _projectWrapper.add(arg1, arg2)
addTerm = _projectWrapper.add
// usage
>>> result = projectWrapper.add(2, 4)
>>> print result
[0, 6L]
Bạn không cần phải vượt qua trong "resultLong", nhưng nó được nối vào kết quả tự động. Tuyệt quá!
Tuy nhiên, điều này dường như không được làm việc như tôi mong đợi khi các loại đầu ra là một số con trỏ tới một kiểu lớp:
// .h
int GetClassType(const char* name, exportedClassType*& resultPointer);
class exportedClassType
{...}
// interface.i
%apply exportedClassType*& OUTPUT { exportedClassType*& resultPointer };
int GetClassType(const char* name, exportedClassType*& resultPointer);
// projectWrapper.py
def GetClassType(name, resultPointer):
return _projectWrapper.GetClassType(name, resultPointer)
GetClassType = _projectWrapper.GetClassType
Vấn đề dường như là SWIG đã không được xử lý nó trong cùng theo cách đơn giản. Nó vẫn xuất hiện như một tham số "đầu vào" trong chữ ký hàm bọc.
// attempted usage
>>> classType = projectWrapper.GetClassType("name")
TypeError: GetClassType() takes exactly 2 arguments (1 given)
>>> result = 0
>>> projectWrapper.GetClassType("name", result)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: in method 'GetClassType', argument 2 of type 'exportedClassType *&'
Ai đó có thể cho tôi biết tôi đang làm gì sai hoặc hướng tôi đi đúng hướng? Bất kỳ sự giúp đỡ biết ơn nhận được! Cảm ơn
Bạn đã thử sử dụng con trỏ kép chưa? Tôi đã có vấn đề với con trỏ đôi và mã được tạo ra bằng cách sử dụng SWIG 2.0.7, nhưng điều này được giải quyết trong 3.X.X –
Cảm ơn bạn đã trả lời. Xin lỗi, nó sẽ trông như thế nào trong file interface.i? – SWilliams
Tôi nên đề cập rằng tôi không sở hữu C++ và không thể thay đổi chữ ký của phương thức ở đó. Tôi chắc chắn cần phải xử lý một phương thức lấy tham số 'exportsClassType * &'. – SWilliams