老公原谅我在老公面前,小情侣在废弃楼房里约会电视剧,大赛每日一赛吃瓜爆料

  • 您的位置:首页 > 新闻动态 > 技术文章

    PYTHON调用C++DLL的参数传递方法

    2019/9/16??????点击:

    1. PYTHON与C++参数变量的比较

    2. 准备一个C++ DLL的测试工程文件,并编译产生DLL文件,代码如下:
    C++文件(cpp):(注意在函数声明上加上extern "C" 的修饰)

    #include “testdll.h”
    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);
    }

    在python脚本中使用ctypes加载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.HelloWorld
     hello.argtypes=[POINTER(c_char)]    #传入参数为字符指针
     STR=(c_char * 100)(*bytes("WiseGlove数据手套",'utf-8')) #把一组100个的字符定义为STR
     cast(STR, POINTER(c_char))
     hello(STR)
     输出:WiseGlove数据手套 

    4.对于其他数据类型的数组,(例如int*),操作相似: Ints=dll.Ints
     Ints.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=' ')
    怎么样, 小伙伴们学会了Python语言调用C++dll的方法了吗? 使用这个方法,可以调用WONGLOVE数据手套的sdk开发库获得数据手套的角度数据哦~~



    主站蜘蛛池模板: 吉木萨尔县| 罗定市| 南通市| 西和县| 海阳市| 安远县| 赣州市| 洪雅县| 乐清市| 南陵县| 客服| 宜兴市| 曲麻莱县| 崇明县| 周宁县| 蒙阴县| 南靖县| 绿春县| 清涧县| 城口县| 菏泽市| 武功县| 合肥市| 建德市| 大理市| 化州市| 定结县| 云林县| 新巴尔虎右旗| 江口县| 四会市| 滁州市| 安多县| 永川市| 伊吾县| 东乡| 台东县| 蒲城县| 永德县| 新闻| 霸州市|