zoukankan      html  css  js  c++  java
  • python 调用C++ DLL,传递int,char,char*,数组和多维数组

    ctypes 数据类型和 C数据类型 对照表

    ctypes typeC typePython type
    c_bool _Bool bool (1)
    c_char char 1-character string
    c_wchar wchar_t 1-character unicode string
    c_byte char int/long
    c_ubyte unsigned char int/long
    c_short short int/long
    c_ushort unsigned short int/long
    c_int int int/long
    c_uint unsigned int int/long
    c_long long int/long
    c_ulong unsigned long int/long
    c_longlong __int64 or long long int/long
    c_ulonglong unsigned __int64 or unsigned long long int/long
    c_float float float
    c_double double float
    c_longdouble long double float
    c_char_p char * (NUL terminated) string or None
    c_wchar_p wchar_t * (NUL terminated) unicode or None
    c_void_p void *

    int/long or None

    //C++文件

    #include<iostream>
    
    using namespace std;
    
    //该文件名称:cpptest.cpp
    
    //终端下编译指令:
    
    //g++ -o cpptest.so -shared -fPIC cpptest.cpp
    
    //-o 指定生成的文件名,-shared 指定微共享库,-fPIC 表明使用地址无关代码
    
    extern "C"{//在extern “C”中的函数才能被外部调用
    
        int test(int int_test,char char_test,char *test_string,int int_arr[4],char char_arr2[2][2]) {
    
            cout<<"输出参数中的int型:";
            cout<<int_test<<endl;
    cout
    <<"输出参数中的char型:"; cout<<char_test<<endl;
    cout
    << "输出参数中的字char*字符:"; cout<<test_string<<endl; cout << "输出参数中的int数组"; for(int x = 0;x< 4;x++){cout << int_arr[x]<<" ";} cout << endl; cout <<"输出参数中的二维数组:"; for(int x = 0;x<2;x++){ for(int y = 0;y<2;y++){ cout <<char_arr2[x][y] << " "; } } cout << endl; return 0; } }



    //py文件

    import ctypes
    
    mylib = ctypes.cdll.LoadLibrary("cpptest.so")
    
    char_p_test = bytes("中国","utf8")#汉字需用采用utf8编码
    
    int_arr4 = ctypes.c_int*4
    
    int_arr = int_arr4()
    
    int_arr[0] = 1
    
    int_arr[1] = 3
    
    int_arr[2] = 5
    
    int_arr[3] = 9
    
    char_arr2 = ctypes.c_char*2
    
    char_arr22 = char_arr2*2
    
    char_arr22a = char_arr22()
    
    char_arr22a[0][0] = b'a'
    
    char_arr22a[0][1]=  b'b'
    
    char_arr22a[1][0] = b'c'
    
    char_arr22a[1][1] = b'd'
    
    mylib.test(9999,'a',char_p_test,int_arr,char_arr22a)



    参考:python 调用C++,传递int,char,char*,数组和多维数组

    结构体传参

    https://www.jb51.net/article/52513.htm


    『Python CoolBook』使用ctypes访问C代码_下_demo进阶

    https://www.programcreek.com/python/example/1243/ctypes.c_char_p

  • 相关阅读:
    mysqllog
    清理:db上面的过期的binlog,释放磁盘空间。 (转)
    linux下shell命令trap
    mvc
    uci随笔
    luci 随笔
    shell脚本 整数比较
    lua学习
    OPENWRT make menuconfig错误之一
    openwrt 中make的使用
  • 原文地址:https://www.cnblogs.com/code1992/p/11211974.html
Copyright © 2011-2022 走看看