博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python调用C++ DLL 传参技巧
阅读量:5230 次
发布时间:2019-06-14

本文共 2024 字,大约阅读时间需要 6 分钟。

结构体传参:

 

 

准备工作:

C++文件(cpp):(注意在函数声明上加上extern "C" 的修饰)

#include 
extern "C" { __declspec(dllexport) int Double(int x); __declspec(dllexport) float floatAdd(float a,float b); __declspec(dllexport) void HelloWorld(char * str); __declspec(dllexport) void Ints(int * arr,int n); } int Double(int x){ return x*2;}float floatAdd(float a,float b) { return a+b;}void HelloWorld(char * str){ puts(str);}void Ints(int * arr,int n){ for(int i=0;i

用g++(mingw64位)编译为dll:

g++ dlltest.cpp -shared -o dlltest.dll -Wl,--out-implib,dlltest.libpause

在python脚本中加载dll :

from ctypes import *dll = cdll.LoadLibrary('DLL/dlltest.dll')

 

1.如果不加任何修饰,默认传入参数为int,传出参数也为int

 

2.对于int以外的类型(如float),需要声明python函数的传入参数类型传出参数类型

fun.argtypes=[c_float,c_float]  #定义传参类型fun.restype=c_float             #定义返回值类型a=fun(c_float(1.4),c_float(1.2))print(type(a))print(a)

输出:

2.5999999046325684

 

3.对于字符串char* ,在声明传入参数类型时,需要声明为字符指针,然后分配一块char数组,最后把这个数组强制转换为字符指针

并且,在把python脚本中的数据结构导入c++中时,需要把str转换为bytes或者bytesarray类型,并且进行迭代器分解

hello=dll.HelloWorldhello.argtypes=[POINTER(c_char)]    #传入参数为字符指针STR=(c_char * 100)(*bytes("相信你还在这里",'utf-8')) #把一组100个的字符定义为STRcast(STR, POINTER(c_char))hello(STR)

输出:

相信你还在这里

 

4.对于其他数据类型的数组,(例如int*),操作相似:

Ints=dll.IntsInts.argtypes=[POINTER(c_int),c_int]INT=(c_int * 100)(*[1,2,3]) #把列表传入变长参数args*中cast(INT, POINTER(c_int))Ints(INT,c_int(3))

输出:

1 2 3

 

5.对于返回值为数组的情况,可以直接使用索引去访问,但是下标操作[]不是从迭代器中取对象,而是地址偏移:

def fillHoleCpp(im):    dll = cdll.LoadLibrary("bfs.dll")    bfs=dll.bfs    bfs.argtypes = [POINTER(c_int),c_int]    bfs.restype = POINTER(c_int)    a = np.asarray(range(16), dtype=np.int32).reshape([4, 4])    if not a.flags['C_CONTIGUOUS']:        a = np.ascontiguous(a, dtype=a.dtype)  # 如果不是C连续的内存,必须强制转换    IMG = cast(a.ctypes.data, POINTER(c_int))  # 转换为ctypes,这里转换后的可以直接利用cty    cast(IMG, POINTER(c_int))    length=a.size    ans=bfs(IMG,c_int(length))    print(type(ans))    for i in range(0,length):        print(ans[i],end=' ')

 

转载于:https://www.cnblogs.com/TQCAI/p/8881530.html

你可能感兴趣的文章
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>