代码之家  ›  专栏  ›  技术社区  ›  4am

使用python ctypes通过引用c++函数传递长向量

  •  0
  • 4am  · 技术社区  · 7 年前

    我使用python3和c++11编译器。 我试图传递一个ctypes.c_void_p指针,但它给出了错误的结果。

    extern "C" {
     int pke_decrypt(char *a,char *b,vector<long> &v)
      {do something;
       assign v;
       }}
    

    测试.py

    _p=ctypes.CDLL('/home/electrical/Downloads/src/libpke.so')
     _p.pke_decrypt.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_void_p))]
     def decrypt(input1,input2):
        global _p   
        v=ctypes.c_void_p()
        print (v)
        result=_p.pke_decrypt(input1.encode('utf-8'),input2.encode('utf-8'),ctypes.byref(v))
        print (v)
        return
    

    我希望得到一个随机大小的数组(在c++函数中计算)作为输出。也就是说,结果向量的大小不是预定义的,否则我可以使用numpy.ndpointers()并定义一个返回类型,然后从c返回一个动态分配的数组。

    1 回复  |  直到 7 年前
        1
  •  0
  •   4am    7 年前

    我通过引用c++传递了char*

    测试.py

    _pqc=ctypes.CDLL('/home/electrical/Downloads/src/libpke.so')
    _pqc.pke_decrypt.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_char_p)]
     def pke_decrypt(input1,input2):
         global _p
         v=ctypes.c_char_p()    
         result=_pqc.pke_decrypt(input1.encode('utf-8'),input2.encode('utf-8'),ctypes.byref(v))
         print((v.value).decode("utf-8"))
         return
    

    int pke_decrypt(char *input1,char *input2,char* &vout){
       Internal conversion from char* to vector<long> 
    }