c - 将 float32 的 Go 切片作为 C float[] 传递给 CGo
问题描述
我正在尝试使用 catboost 来预测一组浮点数。
在CalcModelPredictionSingle
它的文档中作为参数"floatFeatures - array of float features"
:
https ://github.com/catboost/catboost/blob/master/catboost/libs/model_interface/c_api.h#L175
但是,当我尝试传递浮点数组时,出现此错误:
Cannot use type []*_Ctype_float as *_Ctype_float in assignment.
表示它期待一个浮动。我使用了错误的功能吗?
我正在使用 cgo,这是我的代码的一部分:
```
floats := []float32{}
//gets populated
floatsC := make([]*C.float, len(floats))
for i, v := range floats {
floatsC[i] = (*C.float)(&v)
}
if !C.CalcModelPredictionSingle(
model.Handle,
([]*C.float)(floatsC),
...
) {
return
}
解决方案
API 需要一个 s 数组float
,但[]*C.float
您尝试创建的是一个指向float
s 的指针数组。这些是不兼容的类型,这正是编译器所说的。
好消息是这些都不是必需的,因为 Go[]float32
与 C 布局兼容,float[]
因此您可以将 Go 切片作为指向其第一个元素的指针直接传递给 C 函数。
floats := []float32{}
//gets populated
if !C.CalcModelPredictionSingle(
model.Handle,
(*C.float)(&floats[0]), // pass the pointer to the first slice element
C.size_t(len(floats)), // pass the slice length
...
) {
return
}
请注意,在 C 中float[]
和*float
是一回事。
推荐阅读
- mongodb - 带有 Raspberry Pi 的廉价 MongoDB 副本集,它不会减慢主实例的速度
- php - WP_Query 使用 's' 和 tax_query 不起作用 (Woocommerce)
- javascript - ANTD动态形式-初始值
- azure - 如何使用逻辑应用将 Azure SQL 数据库中的大表导出为 CSV
- matrix - Gnuplot:绘制矩阵时从数据文件中跳过点
- c# - 实体框架基础属性映射
- vba - 通过 Load 事件初始化 Access 表单的 VBA 代码
- excel - 如果时间介于两次之间 - 将值更新为新时间
- c++ - 如何在 Wondershare Filmora Scrn 等 mac os 中录制系统声音?
- javascript - AngularJS 不读取 REST 上的 Iframe 元素