1

我正在尝试使用与 C 兼容的标头调用 C++ 库中的函数,该函数希望我传入一个 4x4 矩阵以填充它。

我的 Go 函数定义如下所示:

func GetMatrix(matrix [][]float32)

func GetMatrix(matrix []float32)

而 c 头文件定义它是这样的:

void getMatrix(const float **matrix)

我尝试使用 C.GoBytes 来获取一个字节数组,但是从那里我有点迷失,因为我必须从一个字节数组转到一个指针数组,然后我再次将其转换为一个字节数组,最终是一组浮点数。

至少我认为这是我需要做的。

我见过用 C 数组数据替换底层 Go 切片的代码示例,但我相信在这些情况下,Go GC 不会收集它们。理想情况下,矩阵 [][]float32 的行为类似于普通的 Go 切片。

编辑: 文档不正确,底层 C 类型实际上是一个 16 元素浮点数组。

那么问题就变成了,我可以将 C.GoBytes 与指针一起使用,指向数组的指针吗?如果可以,我如何从 []byte 中获取 []float32?

4

5 回答 5

1

编辑这打印正确的东西

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])))
}
于 2012-10-05T17:17:17.110 回答
1

这是一种将指向 go 数组的指针传递给 C 函数的方法,因此 C 函数可以填充它:

package main
/*
#include <stdio.h>
void getMatrix(float *m) {
    int i;
    for(i = 0; i < 16; i++) {
        m[i] = (float)i;
    }
}
*/
import "C"
import "fmt"
func main() {
    var a [16]float32
    C.getMatrix((*C.float)(&a[0]))
    fmt.Println(a)
}
于 2013-04-04T20:45:25.727 回答
0

我认为你必须使用的 Go 类型是

*[16]*float32

在任何情况下, [][]float32 永远不会与 C 的 **float 兼容。

于 2012-05-23T21:55:59.857 回答
0

指向 4x4 数组的指针的类型为*[4]*[4]float32

于 2012-05-24T06:25:55.403 回答
0

扩展 Inuart 提供的答案:

package main

/*
#include <stdio.h>
void getMatrix(const float **matrix){
    float *m = (float *)*matrix;
    int i;
    for(i = 0; i<16; i++) {
       printf("%f\n",m[i]);
    }
}
*/
import "C"

import "unsafe"

func main() {
    // Create the contiguous 16 element array, but organise it how it is described.
    a := [4][4]float32{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16},
    }
    m := &a // Take the pointer.
    C.getMatrix((**C.float)(unsafe.Pointer(&m))) // Take the handle and pass it.
}

这为您提供了您似乎要求的句柄行为,并且具有 Go 中数据的形状似乎是 C API 要求的优势 - 无需回避易用性和安全性去吧,只是因为你正在与 C 交互。

于 2013-01-30T04:32:49.173 回答