在python中,使用ctypes访问强制转换为int数组指针的变量时出现问题

在python中,使用ctypes访问强制转换为int数组指针的变量时出现问题,python,pointers,casting,multidimensional-array,ctypes,Python,Pointers,Casting,Multidimensional Array,Ctypes,我有一个C代码,它使用一个变量data,这是一个用大小可变的malloc创建的大型2d数组。现在我必须编写一个接口,以便可以从Python中调用C函数。我用ctypes来做这个 C代码: FOO* pytrain(float **data){ FOO *foo = foo_autoTrain((float (*)[])data); return foo; } 与 Python代码: autofoo=cdll.LoadLibrary("./libfoo.so") ... data

我有一个C代码,它使用一个变量
data
,这是一个用大小可变的malloc创建的大型2d数组。现在我必须编写一个接口,以便可以从Python中调用C函数。我用ctypes来做这个

C代码:

FOO* pytrain(float **data){
    FOO *foo = foo_autoTrain((float (*)[])data);
    return foo;
}

Python代码:

autofoo=cdll.LoadLibrary("./libfoo.so")
... data gets filled ...
foo = autofoo.pytrain(pointer(pointer(p_data)))
我的问题是,当我试图访问foo_autoTrain中的
数据时,我只会得到
0.0
或其他随机值,随后会出现seg故障。那么,如何在Python中将
float(*)[])数据传递给foo_autoTrain呢


如果我对问题的某些部分描述得不够充分,请毫不犹豫地指出。

在我看来,这个问题是对多维数组在C中如何工作的错误理解。
a[r][C]
这样的表达式可能意味着两种情况之一,具体取决于
a
的类型。如果
a
的类型为
float**
,则表达式将表示双指针偏移解引用,如果长时间执行,则类似于此:

float *row = a[r]; // First dereference yields a pointer to the row array
return row[c]      // Second dereference yields the value
如果
a
的类型改为
float(*)[ncols]
,则表达式将成为将连续的一维内存区域塑造为多维数组的简写形式:

float *flat = (float *)a;
return flat[(r * ncols) + c]; // Same as a[r][c]
因此,在C代码中,
pytrain()
的参数类型应该是
float*
float(*)[ncols]
,并且Python代码应该如下所示(假设对数组数据使用NumPy):

如果您实际上正在使用NumPy,请查看

float *flat = (float *)a;
return flat[(r * ncols) + c]; // Same as a[r][c]
c_float_p = ctypes.POINTER(ctypes.c_float)
autofoo.pytrain.argtypes = [c_float_p]
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]], dtype=numpy.float32)
data_p = data.ctypes.data_as(c_float_p)
autofoo.pytrain(data_p)