在python中,使用ctypes访问强制转换为int数组指针的变量时出现问题
我有一个C代码,它使用一个变量在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
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)