go - CGO 从 C ** float 得到一个 [][]float32

标签 go

我正在尝试使用 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/

相关文章:

go - 为p分配的内存在哪里

string - 突变Golang中的字符串?

go - json 编码结构数组的一个属性

go - 如何使用 Go 解析 URL 中的重复参数

mongodb - 使用 mgo 存储嵌套结构

Go vs Rust 垃圾收集器性能和类型

go - 使用 sync.WaitGroup 时获取 "fatal error: all goroutines are asleep - deadlock!"

go - 如何在 Heroku 上正确安装 cloud-torrent

node.js - 如何在 Go 或 node.js 中接受没有 http 版本和主机 header 的 http 请求?

database - 变量持续存在时的“延迟”顺序