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成uintptrgolang類型。
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 關注
- 162 瀏覽
添加回答
舉報
