python的types函数_带ctypes函数的Numpy数组接口

我正在尝试将一个共享的C库与一些python代码连接起来。

与库的接口类似于typedef struct{

int v1;

double* v2} input;

还有两种与此类似的类型:for configuration和output类型。在

我使用ctypes Structures在python中设置这些结构,如下所示:

^{pr2}$

C代码有一些函数接收指向该结构的指针,参数类型定义如下:fun.argtypes = [constraints,input,POINTER(input)]

constraints是另一种结构,其中包含一些用于配置的int字段。在

首先更新input结构中的v2字段input.v2 = generated_array.ctypes.data_as(POINTER(c_double))

然后我称之为:fun(constraints,input,byref(output))

函数原型要求struct和*to struct(假设输出结构类型与输入结构类型相同)。在

然后我想访问存储在v2输出字段中的结果。但我得到了意想不到的结果。有更好/正确的方法吗?在

我在这里搜了很多遍,并阅读了文档,但我找不到哪里出了问题。我没有任何错误消息,但是从共享库收到的警告似乎表明这些接口上存在错误。在

我想我已经发现了问题:

当我调用这个方法时,会调用一个复数数组。然后我创建4个向量:out_real = ascontiguousarray(zeros(din.size,dtype=c_double))

out_imag = ascontiguousarray(zeros(din.size,dtype=c_double))

in_real = ascontiguousarray(din.real,dtype = c_double)

in_imag = ascontiguousarray(din.imag,dtype = c_double)

其中,din是输入向量。我用这种方式测试了这个方法:print in_real.ctypes.data_as(POINTER(c_double))

print in_imag.ctypes.data_as(POINTER(c_double))

print out_real.ctypes.data_as(POINTER(c_double))

print out_imag.ctypes.data_as(POINTER(c_double))

结果是:

看起来他们都指向同一个地方。在

经过一些改变,它像预期的那样工作。。。在

经过几次测试,我发现第一次代码几乎是正确的。我创建了一次Structure实例并更新了它的字段。{cd4>的每个调用都改为创建一个新的实例。我还将所有数组类型更改为等效的ctypes类型;这似乎使函数按预期工作。在

print行为仍然与上面的测试一样有效,但是函数似乎在处理这个奇怪的行为时仍然有效。以下@ericsun评论指出,这是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值