我正在尝试使用 C 兼容 header 调用 C++ 库中的函数,这需要我传入一个 4x4 矩阵以供其填充。
我的 Go 函数定义如下所示:
func GetMatrix(matrix [][]float32)
罢工><罢工>罢工>
func GetMatrix(matrix []float32)
c 头文件是这样定义的:
void getMatrix(const float **matrix)
我试过使用 C.GoBytes 来获取字节数组,但是从那里我有点迷路了,因为我必须从字节数组转到指针数组,然后我再次将其转换到一个字节数组,最后是一个 float 数组。
至少我认为这是我需要做的。
我见过用 C 数组数据替换底层 Go slice 的代码示例,但我相信在这些情况下,Go GC 不会收集它们。理想情况下,矩阵 [][]float32 的行为类似于普通的 Go slice 。
编辑: 文档不正确,底层 C 类型实际上是一个 16 元素的 float 组。
那么问题就变成了,我可以将 C.GoBytes 与一个指向数组指针的指针一起使用吗?如果可以,我如何从 []byte 中获取一个 []float32?
最佳答案
已编辑 这会打印正确的内容
package main
/*
#include <stdio.h>
void getMatrix(const float **matrix){
float *m = (float *)matrix;
int i;
for(i = 0; i<9; i++) {
printf("%f\n",m[i]);
}
}
*/
import "C"
import "unsafe"
func main() {
a := []float32{1,2,3,4,5,6,7,8,9}
C.getMatrix((**C.float)(unsafe.Pointer(&a[0])))
}
关于go - CGO 从 C ** float 得到一个 [][]float32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728197/