我用swig包裝了一些C++的api函數。 有一個函數,接口是f(char * [] strs)。我怎麼能從python得到char * []
如何將有效參數傳遞給此函數。 這就是我所做的。
str = ["str","str2"]
f(str)
它會拋出錯誤
TypeError: in method 'f', argument 1 of type 'char *[]
我用swig包裝了一些C++的api函數。 有一個函數,接口是f(char * [] strs)。我怎麼能從python得到char * []
如何將有效參數傳遞給此函數。 這就是我所做的。
str = ["str","str2"]
f(str)
它會拋出錯誤
TypeError: in method 'f', argument 1 of type 'char *[]
痛飲不轉換陣列到Python會自動列出。由於您使用的是C++,因此您的f
使用std :: string和std :: vector,那麼SWIG將自動進行所有必要的轉換(不要忘記包含「std_vector.i」等,請參閱SWIG文檔):
void f(std::vector<std::string> > strs)
如果不能修改的f
的聲明,你可以在。我創建%inline
包裝:
%inline {
void f(const std::vector<std::string> >& strs)
{
// create tmpCharArray of type char*[] from strs
const char* tmpCharArray[] = new const char* [strs.size()];
for (i=0; i<strs.size(); i++)
tmpCharArray[i] = strs[i].c_str();
f(tmpCharArray);
delete[] tmpCharArray;
}
}
謝謝!這是我需要的答案。 – Crazymooner
很酷。讓我知道是否有任何需要改進的地方,歡迎來到SO! – Schollii
這是一個足夠好的答案。我發現[東西](http://www.swig.org/Doc1.3/Python.html#Python_nn59)更酷。這樣,我甚至不必編寫一個包裝器,char **可以用於所有需要的功能。 – Crazymooner
檢查'˚Ffunction',它採用'的char []'列表你給了'string of list'。所以用'char list'調用''f函數'.' –
@Odedra char *是一個C中的字符串,你可以像這樣初始化一個char * []。 char * list [] = {「str」,「str1」} – Crazymooner