python调用c++ ctype list传数组或者返回数组的方法
示例1:
pycallclass.cpp:
#includeusingnamespacestd; typedefunsignedcharBYTE; #defineMAX_COUNT20 structtagOutCardResult_py { BYTE cbCardCount; BYTE cbResultCard1; BYTE cbResultCard2; BYTE cbResultCard3; BYTE cbResultCard4; BYTE cbResultCard5; BYTE cbResultCard6; BYTE cbResultCard7; BYTE cbResultCard8; BYTE cbResultCard9; BYTE cbResultCard10; BYTE cbResultCard11; BYTE cbResultCard12; BYTE cbResultCard13; BYTE cbResultCard14; BYTE cbResultCard15; BYTE cbResultCard16; BYTE cbResultCard17; BYTE cbResultCard18; BYTE cbResultCard19; BYTE cbResultCard20; }; structtagOutCardResult { BYTE cbCardCount; BYTE cbResultCard[MAX_COUNT]; voidclear() { cbCardCount=0; for(intnIdx=0;nIdx cbCardCount=cbCardCount; cout<<"topyfunction1"< cbResultCard1=cbResultCard[1-1]; cout<<"topyfunction2"< cbResultCard2=cbResultCard[2-1]; ppy->cbResultCard3=cbResultCard[3-1]; ppy->cbResultCard4=cbResultCard[4-1]; ppy->cbResultCard5=cbResultCard[5-1]; ppy->cbResultCard6=cbResultCard[6-1]; ppy->cbResultCard7=cbResultCard[7-1]; ppy->cbResultCard8=cbResultCard[8-1]; ppy->cbResultCard9=cbResultCard[9-1]; ppy->cbResultCard10=cbResultCard[10-1]; ppy->cbResultCard11=cbResultCard[11-1]; ppy->cbResultCard12=cbResultCard[12-1]; ppy->cbResultCard13=cbResultCard[13-1]; ppy->cbResultCard14=cbResultCard[14-1]; ppy->cbResultCard15=cbResultCard[15-1]; ppy->cbResultCard16=cbResultCard[16-1]; ppy->cbResultCard17=cbResultCard[17-1]; ppy->cbResultCard18=cbResultCard[18-1]; ppy->cbResultCard19=cbResultCard[19-1]; ppy->cbResultCard20=cbResultCard[20-1]; cout<<"topyfunctionend"< cbCardCount:"< cbCardCount< cbResultCard1:"< cbResultCard1< 编译脚本:
g++-olibpycallclass.so-shared-fPICpycallclass.cpp-I/usr/include/python2.6-L/usr/lib64/python2.6/config
Game.py调用部分。类声明:
importctypes classtagOutCardResult_py(ctypes.Structure): _fields_=[("cbCardCount",ctypes.c_ubyte),\ ("cbResultCard1",ctypes.c_ubyte),\ ("cbResultCard2",ctypes.c_ubyte),\ ("cbResultCard3",ctypes.c_ubyte),\ ("cbResultCard4",ctypes.c_ubyte),\ ("cbResultCard5",ctypes.c_ubyte),\ ("cbResultCard6",ctypes.c_ubyte),\ ("cbResultCard7",ctypes.c_ubyte),\ ("cbResultCard8",ctypes.c_ubyte),\ ("cbResultCard9",ctypes.c_ubyte),\ ("cbResultCard10",ctypes.c_ubyte),\ ("cbResultCard11",ctypes.c_ubyte),\ ("cbResultCard12",ctypes.c_ubyte),\ ("cbResultCard13",ctypes.c_ubyte),\ ("cbResultCard14",ctypes.c_ubyte),\ ("cbResultCard15",ctypes.c_ubyte),\ ("cbResultCard16",ctypes.c_ubyte),\ ("cbResultCard17",ctypes.c_ubyte),\ ("cbResultCard18",ctypes.c_ubyte),\ ("cbResultCard19",ctypes.c_ubyte),\ ("cbResultCard20",ctypes.c_ubyte)]Game.py调用部分。具体调用:
importctypes so=ctypes.cdll.LoadLibrary lib=so("./libpycallclass.so") ERROR_MSG('display(\)') ret=tagOutCardResult_py(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) ERROR_MSG("beforelib.display(ctypes.byref(ret))") lib.display(ctypes.byref(ret)) ERROR_MSG("afterlib.display(ctypes.byref(ret))") ERROR_MSG('#######################################################################################') ERROR_MSG(ret) ERROR_MSG(ret.cbCardCount) ERROR_MSG(ret.cbResultCard1) ERROR_MSG(ret.cbResultCard2) ERROR_MSG(ret.cbResultCard3) ERROR_MSG(type(ret))传入一个结构体,使用引用返回,回到python中打印出来结果是对的。
这样就可以传入,可以传出了。
示例1end#########################################################################
示例2:
pycallclass.cpp:
#includeusingnamespacestd; typedefunsignedcharBYTE; #defineMAX_COUNT20 #ifdefined(WIN32)||defined(WINDOWS) #defineDLL_EXPORT__declspec(dllexport) #else #defineDLL_EXPORT #endif structByteArray_20 { BYTEe1; BYTEe2; BYTEe3; BYTEe4; BYTEe5; BYTEe6; BYTEe7; BYTEe8; BYTEe9; BYTEe10; BYTEe11; BYTEe12; BYTEe13; BYTEe14; BYTEe15; BYTEe16; BYTEe17; BYTEe18; BYTEe19; BYTEe20; }; structByteArray_20_3 { ByteArray_20e1; ByteArray_20e2; ByteArray_20e3; }; structByteArrayNew_20_3 { BYTEe[3][20]; }; classTestLib { public: voidLogicFunc(ByteArray_20_3&ret); voidLogicFuncNew(ByteArrayNew_20_3&ret); }; voidTestLib::LogicFunc(ByteArray_20_3&ret){ ret.e1.e1=3; ret.e1.e2=1; ret.e1.e3=50; ret.e2.e1=100; ret.e2.e2=200; ret.e2.e3=20; cout<<"TestLib::LogicFunc"< pycallclass.py:
importctypes defERROR_MSG(str): printstr classByteArray_20(ctypes.Structure): _fields_=[\ ("e1",ctypes.c_ubyte),\ ("e2",ctypes.c_ubyte),\ ("e3",ctypes.c_ubyte),\ ("e4",ctypes.c_ubyte),\ ("e5",ctypes.c_ubyte),\ ("e6",ctypes.c_ubyte),\ ("e7",ctypes.c_ubyte),\ ("e8",ctypes.c_ubyte),\ ("e9",ctypes.c_ubyte),\ ("e10",ctypes.c_ubyte),\ ("e11",ctypes.c_ubyte),\ ("e12",ctypes.c_ubyte),\ ("e13",ctypes.c_ubyte),\ ("e14",ctypes.c_ubyte),\ ("e15",ctypes.c_ubyte),\ ("e16",ctypes.c_ubyte),\ ("e17",ctypes.c_ubyte),\ ("e18",ctypes.c_ubyte),\ ("e19",ctypes.c_ubyte),\ ("e20",ctypes.c_ubyte)] classByteArray_20_3(ctypes.Structure): _fields_=[\ ("e1",ByteArray_20),\ ("e2",ByteArray_20),\ ("e3",ByteArray_20)] def__init__(self): self.aaa=123 self.bbb=[1,2,3,4,5] self.ccc="alksdfjlasdfjk" deftest(self): self.aaa=123 self.bbb=[1,2,3,4,5] self.ccc="alksdfjlasdfjk" self.e1.e1=5 self.e1.e2=20 so=ctypes.cdll.LoadLibrary lib=so("./libpycallclass.dll") print('display()') ret=ByteArray_20_3() ret.test() ERROR_MSG(ret.e1.e1) ERROR_MSG(ret.e1.e2) print("beforelib.display(ctypes.byref(ret))") lib.display(ctypes.byref(ret)) print("afterlib.display(ctypes.byref(ret))") print('#######################################################################################') print(ret) ERROR_MSG(ret.e1) ERROR_MSG(ret.e2) ERROR_MSG(ret.e3) ERROR_MSG(ret.e1.e1) ERROR_MSG(ret.e1.e2) ERROR_MSG(ret.e1.e3) ERROR_MSG(ret.e2.e1) ERROR_MSG(ret.e2.e2) ERROR_MSG(ret.e2.e3) ERROR_MSG(type(ret)) print("beforelib.display2(ctypes.byref(ret))") lib.display2(ctypes.byref(ret)) print("afterlib.display2(ctypes.byref(ret))") print('#######################################################################################') print(ret) ERROR_MSG(ret.e1) ERROR_MSG(ret.e2) ERROR_MSG(ret.e3) ERROR_MSG(ret.e1.e1) ERROR_MSG(ret.e1.e2) ERROR_MSG(ret.e1.e3) ERROR_MSG(ret.e2.e1) ERROR_MSG(ret.e2.e2) ERROR_MSG(ret.e2.e3) ERROR_MSG(type(ret)) ret.test() ERROR_MSG(ret.e1.e1) ERROR_MSG(ret.e1.e2)g++:
g++-olibpycallclass.so-shared-fPICpycallclass.cpp-I/usr/include/python2.6-L/usr/lib64/python2.6/config
windows:
新建一个DLL工程,把pycallclass.cpp加进去,编译成DLL就OK了。
千万注意python的运行时是32位的还是64位的,DLL或者SO必须和它对应。
python类可以嵌套使用,继承ctypes.Structure,部分成员是_fields_里定义的,部分成员在__init__里定义,这样的类也可以ctypes.byref(self)传进c++去,传的是指针,传入传出就都OK了。
注意示例2中ByteArrayNew_20_3的用法,python中是定义了20个变量,c++中是直接一个二维数组。内存结构是一致的,所以可以直接这样使用。注意类型和长度必须一致,否则可能会内存访问越界。
以上这篇python调用c++ctypelist传数组或者返回数组的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。