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

相关文章
相关标签/搜索