cgo中傳遞void **數據。

我有這個一個C函數。用於一個特徵和多個模型之間的比對。數組

int  match(void *feat, void **models, int model_num, float *score, int *index);函數

在C語言中,用void **表達指針數組是天然的方式。測試

Go語言中開始這麼寫,ui

func (s *Lib) Predict(feat []byte, model []byte) (float32, error) {
    cFeat := unsafe.Pointer(&feat[0])
    cModelNum := C.int(1)
    cModels := make([]unsafe.Pointer, cModelNum)
    var cScore C.float
    var cIndex C.int
    cModels[0] = unsafe.Pointer(&model[0])
    ret := C.ul_vpr_match(cFeat,
             (*unsafe.Pointer)(unsafe.Pointer(&cModels[0])),
             cModelNum,
             &cScore,
             &cIndex)
    return float32(cScore), asError(ret, "match")
}spa

測試問題:指針

panic: runtime error: cgo argument has Go pointer to Go pointer [recovered]model

改爲下面方式,能夠。float

func (s *VprLib) Predict(feat []byte, model []byte) (float32, error) {
    cFeat := unsafe.Pointer(&feat[0])
    cModelNum := C.int(1)
    cModels := make([]uintptr, cModelNum)
    var cScore C.float
    var cIndex C.int
    cModels[0] = uintptr(unsafe.Pointer(&model[0]))
    ret := C.ul_vpr_match(cFeat,
             (*unsafe.Pointer)(unsafe.Pointer(&cModels[0])),
             cModelNum,
             &cScore,
             &cIndex)
return float32(cScore), nil
}im

相關文章
相關標籤/搜索