【问题标题】:Ctypes, python. How to pass back a pointer to a C dynamically allocated double array in one of the function arguments?Ctypes,蟒蛇。如何在函数参数之一中传回指向 C 动态分配的双精度数组的指针?
【发布时间】:2015-08-21 02:57:48
【问题描述】:

我有一个C函数void get_data(int &len, double* data),它为数据动态分配内存(大小事先不知道)并返回一个指向数据的指针。我想使用 ctypes 从 python 调用它。

double* data = get_data(int &len) 的版本运行良好,但我需要通过参数传递指针的版本,因为我有多个数据向量。

我尝试了许多不同的方法,但没有任何效果:

fun = cfun.get_data
fun.argtypes = [ct.c_int, ct.POINTER(ct.c_int)]
fun.restype = None

len = ct.c_int()
data_ptr = ct.POINTER(ct.c_double)()

fun(len, data_ptr)

bool(data_ptr) -- NULL -- 它不可变,所以保持为 NULL 在 C 函数为其分配新值之后。 我试过ct.byref(data_ptr),等等。但一直无法获得 数据出来。

非常感谢!

【问题讨论】:

    标签: python c arrays pointers


    【解决方案1】:

    void get_data(int &len, double* data)为数据动态分配内存(大小事先不知道)。

    这在 C 中也不起作用。您将指针的 传递给函数。更改此值将在外部不可见。你应该有 double** data ,例如,如果你想在 get_data 内部分配并在外部传递指针,则指向 double 的指针。

    void get_data(int *len, double** data)
    {
      *len=12;
      *data=malloc(*len);
    
      //fill data
      for(i=0;i<*len;++i) (*data)[i]=<something>;
    
      return;
    }
    

    这是你的答案: Python and ctypes: how to correctly pass "pointer-to-pointer" into DLL?

    【讨论】:

    • 太好了,非常感谢,它(现在几乎可以工作了)。事实上,错误出现在我的 C 语言中——大脑冻结......唯一的变化是 (*data)[i] = ;也许只是我的编译器太挑剔了——但否则会出现段错误。
    • 是的,应该是(*data)[i][] 具有更高的优先级,因此如果没有括号,它首先执行,* 稍后执行。
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多