我想将numpy数组缓冲区的地址传递给c函数,我的C函数看起来像:
void print_float_buff(void *buff)
{
float *b = (float *)buff;
printf("Float Data: %f, %f, %f,n", b[0], b[1], b[2]);
}
在python中,我的代码是:
import numpy as np
fun=ctypes.CDLL("./mylib.so")
l = np.array([10., 12.6, 13.5], dtype = 'float')
address, flag = l.__array_interface__['data']
fun.print_float_buff(ctypes.c_void_p(address))
A在我的c函数中得到了完全不同的数据。地址似乎不太好。如何将正确的地址传递给C函数?谢谢
如果正确指定.argtypes
,ctypes将告诉您类型错误。以下需要与c_float
:兼容的一维阵列
test.c
#include <stdio.h>
#ifdef _WIN32
# define API __declspec(dllexport)
#else
# define API
#endif
API void print_float_buff(float *buff, size_t size)
{
for(size_t i = 0; i < size; ++i)
printf("buff[%zu] = %fn",i,buff[i]);
}
测试.py
from ctypes import *
import numpy as np
dll = CDLL('./test')
dll.print_float_buff.argtypes = np.ctypeslib.ndpointer(c_float,ndim=1),c_size_t
dll.print_float_buff.restype = None
a = np.array([10., 12.6, 13.5])
dll.print_float_buff(a,len(a))
输出:
Traceback (most recent call last):
File "C:test.py", line 9, in <module>
dll.print_float_buff(a,len(a))
ctypes.ArgumentError: argument 1: <class 'TypeError'>: array must have data type float32
根据建议更改阵列:
a = np.array([10., 12.6, 13.5],dtypes='float32')
输出:
buff[0] = 10.000000
buff[1] = 12.600000
buff[2] = 13.500000
我发现了这个问题。在c中,浮点大小为4个字节,而在python中,浮点值大小为8个字节。如果我这样分配数组:
l = np.array([10., 12.6, 13.5], dtype = 'float32')
它运行良好。