为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
动漫人物 2021-04-27 22:21:27
我正在尝试使用C兼容标头在C ++库中调用一个函数,该函数希望我传入4x4矩阵以进行填充。我的Go函数定义如下所示:func GetMatrix(matrix []float32)和c标头定义如下:void getMatrix(const float **matrix)文档不正确,并且基础C类型实际上是一个16元素的float数组。因此问题就变成了,我可以将C.GoBytes与一个指针一起使用,指向一个数组的指针,如果是这样,如何从[] byte中获取一个[] float32?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

编辑这将打印正确的内容


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])))

}


查看完整回答
反对 回复 2021-05-10
?
慕沐林林

TA贡献2016条经验 获得超9个赞

这是一种将指向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)

}


查看完整回答
反对 回复 2021-05-10
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

扩展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交互。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信