gpt4 book ai didi

go - 将 []float32 转换为 C *float

转载 作者:IT王子 更新时间:2023-10-29 01:41:51 42 4
gpt4 key购买 nike

我想将指向 slice []float32 的第一个元素的指针传递给 C 变量,但不知何故我不知道该怎么做。

C 代码:

typedef struct
{ const float *data_in ;
float *data_out ;

} SRC_DATA ;

开始:

mySlice := make([]float32, 20)
foo := C.SRC_DATA{}
foo.data_in = *C.float(&mySlice[0]) // here the program breaks

据我所知,应该可以直接将指向 slice 中第一个元素的指针从 Go 传递到 C,而无需使用 unsafe.Pointer()。

然后 C 函数将遍历 slice (长度已知)。

感谢任何提示!

最佳答案

  1. 您需要使用一段 C.float 类型而不是 float32:
package main
/*
#include <stdio.h>
void test(float *in) {
printf("C %f %f\n", in[0], in[1]);
}
*/
import "C"

func main() {
in := []C.float{1.23, 4.56}
C.test(&in[0]) // C 1.230000 4.560000
}
  1. Go 不允许在传递给 Cgo 的 Go 分配结构中存储 Go 指针:
package main
/*
#include <stdio.h>
typedef struct {
float *in;
float *out;
} SRC_DATA;

void test(SRC_DATA *data) {
printf("C %f %f\n", data->in[0], data->in[1]);
data->out[0] = 8.8;
data->out[1] = 9.9;
}
*/
import "C"
import "fmt"

func main() {
in := []C.float{1.23, 4.56}
out := make([]C.float, 2)
data := &C.SRC_DATA{in: &in[0], out: &out[0]}
C.test(data) // panic: runtime error: cgo argument has Go pointer to Go pointer
fmt.Println("Go", out)
}

但是你可以在 C 中创建一个辅助函数:

package main
/*
#include <stdio.h>
typedef struct {
float *in;
float *out;
} SRC_DATA;

void test(SRC_DATA *data) {
printf("C %f %f\n", data->in[0], data->in[1]);
data->out[0] = 8.8;
data->out[1] = 9.9;
}

void test_helper(float *in, float *out) {
SRC_DATA data;
data.in = in;
data.out = out;
test(&data);
}
*/
import "C"
import "fmt"

func main() {
in := []C.float{1.23, 4.56}
out := make([]C.float, 2)
C.test_helper(&in[0], &out[0]) // C 1.230000 4.560000
fmt.Println("Go", out) // Go [8.8 9.9]
}

或者,您可以在 C 中分配和释放 SRC_DATA 结构:

package main
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct {
float *in;
float *out;
} SRC_DATA;

void test(SRC_DATA *data) {
printf("C %f %f\n", data->in[0], data->in[1]);
data->out[0] = 8.8;
data->out[1] = 9.9;
}

SRC_DATA *alloc_src_data() {
return (SRC_DATA*)malloc(sizeof(SRC_DATA));
}

void free_src_data(SRC_DATA *p) {
free(p);
}
*/
import "C"
import "fmt"


func main() {
in := []C.float{1.23, 4.56}
out := make([]C.float, 2)
data := C.alloc_src_data()
defer C.free_src_data(data)
data.in = &in[0]
data.out = &out[0]
C.test(data) // C 1.230000 4.560000
fmt.Println("Go", out) // Go [8.8 9.9]
}

关于go - 将 []float32 转换为 C *float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40645080/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com