如何将缓冲区地址传递给c



我想将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')

它运行良好。

最新更新