2015-05-05 34 views
1

我有一個C++類,能夠以正常的ASCII或寬格式輸出字符串。我想以Python的形式獲取輸出。我正在使用SWIG(3.0.4版)並閱讀了SWIG文檔。我使用下面的類型映射,從一個標準的C字符串轉換爲我的C++類:使用SWIG for Python在Linux中轉換字符串

%typemap(out) myNamespace::MyString & 
{ 
    $result = PyString_FromString(const char *v); 
} 

能正常工作在Windows與VS2010的編譯器,但它不是在Linux的完全合作。當我編譯Linux下的包文件時,我收到以下錯誤:

error: cannot convert ‘std::string*’ to ‘myNamespace::MyString*’ in assignment 

所以,我想增加一個額外的類型映射到Linux接口文件像這樣:

%typemap(in) myNamespace::MyString* 
{ 
    $result = PyString_FromString(std::string*); 
} 

但我仍然得到同樣的錯誤。如果我手動進入包裝代碼並修復分配,如下所示:

arg2 = (myNamespace::MyString*) ptr; 

然後代碼編譯就好了。我不明白爲什麼我的其他類型圖不起作用。任何想法或解決方案將不勝感激。提前致謝。

回答

1

它看起來不像你的類型地圖正確地使用參數。你應該有這樣的代替:

%typemap(out) myNamespace::MyString & 
{ 
    $result = PyString_FromString($1); 
} 

其中'$ 1'是第一個參數。見SWIG special variables以獲取更多信息[http://www.swig.org/Doc3.0/Typemaps.html#Typemaps_special_variables]

編輯:

處理輸入類型映射,則需要像這樣:

%typemap(in) myNamespace::MyString* 
{ 
    const char* pChars = ""; 
    if(PyString_Check($input)) 
    { 
     pChars = PyString_AsString($input); 
    } 
    $1 = new myNamespace::MyString(pChars); 
} 

你可以做更多的錯誤檢查和處理Unicode與以下代碼:

%typemap(in) myNamespace::MyString* 
{ 
    const char* pChars = ""; 
    PyObject* pyobj = $input; 
    if(PyString_Check(pyobj)) 
    { 
     pChars = PyString_AsString(pyobj); 
     $1 = new myNamespace::MyString(pChars); 
    } 
    else if(PyUnicode_Check(pyobj)) 
    { 
     PyObject* tmp = PyUnicode_AsUTF8String(pyobj); 
     pChars = PyString_AsString(tmp); 
     $1 = new myNamespace::MyString(pChars); 
    } 
    else 
    { 
     std::string strTemp; 
     int rrr = SWIG_ConvertPtr(pyobj, (void **) &strTemp, $descriptor(String), 0); 
     if(!SWIG_IsOK(rrr)) 
      SWIG_exception_fail(SWIG_ArgError(rrr), "Expected a String " 
     "in method '$symname', argument $argnum of type '$type'"); 
     $1 = new myNamespace::MyString(strTemp); 
    } 
} 
+0

@Devian - 非常感謝您的代碼示例,它工作良好l在我的32位和64位版本中。其他兩種構建類型是32位和64位寬字符構建。對於寬字符版本,我需要在SWIG的接口文件中包含std_wiostream.i和std_wsstream.i文件。當我包含這些文件時,我會在包裝文件中包含無關的SWIG語句。這些語句的格式如下:if(SWIG_IsNewObj(res2))delete arg2;這些語句會導致編譯器錯誤,因爲變量res2不存在。任何想法爲什麼這些行被插入到包裝文件中? –