CGO从C ** float获得[] [] float32

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

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

func GetMatrix(matrix []float32)

和c标头定义如下:

void getMatrix(const float **matrix)

文档不正确,并且基础C类型实际上是一个16元素的float数组。

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


动漫人物
浏览 241回答 3
3回答

慕的地6264312

编辑这将打印正确的内容package main/*#include <stdio.h>void getMatrix(const float **matrix){&nbsp; &nbsp; float *m = (float *)matrix;&nbsp; &nbsp; int i;&nbsp; &nbsp; for(i = 0; i<9; i++) {&nbsp; &nbsp; &nbsp; &nbsp; printf("%f\n",m[i]);&nbsp; &nbsp; }}*/import "C"import "unsafe"func main() {&nbsp; &nbsp; a := []float32{1,2,3,4,5,6,7,8,9}&nbsp; &nbsp; C.getMatrix((**C.float)(unsafe.Pointer(&a[0])))}

慕沐林林

这是一种将指向go数组的指针传递给C函数的方法,因此C函数可以填充它:package main/*#include <stdio.h>void getMatrix(float *m) {&nbsp; &nbsp; int i;&nbsp; &nbsp; for(i = 0; i < 16; i++) {&nbsp; &nbsp; &nbsp; &nbsp; m[i] = (float)i;&nbsp; &nbsp; }}*/import "C"import "fmt"func main() {&nbsp; &nbsp; var a [16]float32&nbsp; &nbsp; C.getMatrix((*C.float)(&a[0]))&nbsp; &nbsp; fmt.Println(a)}

鸿蒙传说

扩展Inuart提供的答案:package main/*#include <stdio.h>void getMatrix(const float **matrix){&nbsp; &nbsp; float *m = (float *)*matrix;&nbsp; &nbsp; int i;&nbsp; &nbsp; for(i = 0; i<16; i++) {&nbsp; &nbsp; &nbsp; &nbsp;printf("%f\n",m[i]);&nbsp; &nbsp; }}*/import "C"import "unsafe"func main() {&nbsp; &nbsp; // Create the contiguous 16 element array, but organise it how it is described.&nbsp; &nbsp; a := [4][4]float32{&nbsp; &nbsp; &nbsp; &nbsp; {1, 2, 3, 4},&nbsp; &nbsp; &nbsp; &nbsp; {5, 6, 7, 8},&nbsp; &nbsp; &nbsp; &nbsp; {9, 10, 11, 12},&nbsp; &nbsp; &nbsp; &nbsp; {13, 14, 15, 16},&nbsp; &nbsp; }&nbsp; &nbsp; m := &a // Take the pointer.&nbsp; &nbsp; C.getMatrix((**C.float)(unsafe.Pointer(&m))) // Take the handle and pass it.}这为您提供了您似乎需要的处理行为,并具有Go语言中数据的形状符合C API所要求的优点-无需回避使用的便利性和安全性继续吧,仅因为您正在与C交互。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go