1 回答
TA贡献1824条经验 获得超8个赞
在您的代码中restype
期待_ndtpr
类型,请参阅:
lib.Function.restype = ndpointer(dtype = c_double, shape = (N,))
在 numpy 文档中也可以看到:
def ndpointer(dtype=无,ndim=无,形状=无,标志=无)
[其他文本]
退货
klass : ndpointer 类型对象
一个类型对象,它是一个
_ndtpr
包含 dtype、ndim、shape 和 flags 信息的实例
。[其他文本]
这种方式lib.Function.restype
就是指针类型,在Golang中挪用的类型一定是unsafe.Pointer
。
但是你想要一个需要作为指针传递的切片:
func Function(s0, s1, s2 float64, N int) unsafe.Pointer {
result := make([]float64, N)
for i := 0; i < N; i++ {
result[i] = (s0 + s1 + s2)
}
return unsafe.Pointer(&result)//<-- pointer of result
}
这会导致在Go 和 C 之间传递指针的规则中出现问题。
调用返回后,C 代码可能不会保留 Go 指针的副本。
所以必须转unsafe.Pointer
成uintptr
golang类型。
func Function(s0, s1, s2 float64, N int) uintptr {
result := make([]float64, N)
for i := 0; i < N; i++ {
result[i] = (s0 + s1 + s2)
}
return uintptr(unsafe.Pointer(&result[0]))//<-- note: result[0]
}
这样你就可以正常工作了!
注意: C 中 slice 的结构由 表示typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
,但 C 只需要数据,因为这只是需要结果void *data
(第一个字段,或字段[0])。
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报