1 回答

TA貢獻1824條經(jīng)驗 獲得超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
}
這會導(dǎo)致在Go 和 C 之間傳遞指針的規(guī)則中出現(xiàn)問題。
調(diào)用返回后,C 代碼可能不會保留 Go 指針的副本。
所以必須轉(zhuǎn)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 的結(jié)構(gòu)由 表示typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
,但 C 只需要數(shù)據(jù),因為這只是需要結(jié)果void *data
(第一個字段,或字段[0])。
- 1 回答
- 0 關(guān)注
- 131 瀏覽
添加回答
舉報