2008-11-10 33 views
15

Tôi đang cố gắng để lộ hàm này để Python sử dụng SWIG:Cách hiển thị std :: vector <int> dưới dạng danh sách Python bằng SWIG?

std::vector<int> get_match_stats(); 

Và tôi muốn SWIG để tạo gói mã cho Python để tôi có thể xem nó như là một danh sách các số nguyên.

Thêm này đến tập tin .i:

 
%include "typemaps.i" 
%include "std_vector.i" 

namespace std 
{ 
    %template(IntVector) vector<int>; 
} 

Tôi đang chạy SWIG Version 1.3.36 và kêu gọi uống một lân với -Wall và tôi nhận được không có cảnh báo.

tôi có thể được tiếp cận với một danh sách nhưng tôi nhận được một loạt các cảnh báo khi biên dịch với -Wall (với g++ (GCC) 4.2.4) được tạo ra C++ mã mà nói:

 
    warning: dereferencing type-punned pointer will break strict-aliasing rules 

Tôi phơi bày các chức năng một cách chính xác? Nếu vậy, cảnh báo có ý nghĩa gì?


Đây là những dòng trước dòng vi phạm trong cùng chức năng:

 
SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { 
    PyObject *resultobj = 0; 
    std::vector *arg1 = (std::vector *) 0 ; 
    std::vector::iterator arg2 ; 
    std::vector::iterator result; 
    void *argp1 = 0 ; 
    int res1 = 0 ; 
    swig::PySwigIterator *iter2 = 0 ; 
    int res2 ; 
    PyObject * obj0 = 0 ; 
    PyObject * obj1 = 0 ; 

    if (!PyArg_ParseTuple(args,(char *)"OO:IntVector_erase",&obj0,&obj1)) SWIG_fail; 
    res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0); 
    if (!SWIG_IsOK(res1)) { 
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector *""'"); 
    } 
    arg1 = reinterpret_cast * >(argp1); 

Và đây là dòng vi phạm:

 
    res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0); 

nhiều mã sau đó.

Cảnh báo được tạo ra khi biên dịch với g ++ 4.2.4 là:

 
swig_iss_wrap.cxx: In function ‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*)’: 
swig_iss_wrap.cxx:5885: warning: dereferencing type-punned pointer will break strict-aliasing rules 

Trả lời

15
%template(IntVector) vector<int>; 
+0

Đó là những gì tôi đã thử và tôi nhận được một loạt cảnh báo khi biên dịch bằng g ++. Ý tưởng nào? –

+1

Bạn đang sử dụng phiên bản g ++ nào? Tôi đang sử dụng 4.1.2 và tôi không nhận được bất kỳ cảnh báo nào, ngay cả với -Wall. Tôi không nhớ bất kỳ cảnh báo nào khi tôi sử dụng 3,3 hoặc hơn. Lưu ý thêm "" trong bài đăng này bị thiếu trong bài đăng gốc. –

+0

Các đã có, nhưng nó không được hiển thị. Đã sửa nó! –

0

Tôi không có nhiều kinh nghiệm với Uống một lân, nhưng bạn đang #including tập C++ tiêu đề của bạn trong tập tin .i của bạn ? Hãy thử một (hoặc cả hai) của

%include "myvector.h" 


%{ 
# include "myvector.h" 
%} 
Các vấn đề liên quan