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

如何将 Go 数组传递给 C?

如何将 Go 数组传递给 C?

Go
慕姐4208626 2021-12-07 10:48:43
我在 OpenGL ES 上苦苦挣扎。效果不佳。我在 C 中得到了类似的东西。(我只是复制了 Go 代码并修改了(语法)并删除了(非重要的函数调用)C 的一些东西。)我终于发现 Go 数组没有传递给 C 函数。(所以,数组作为顶点数组,索引不能很好地传递并且在我渲染时做错了。)我用这段代码测试过:C函数部分:void passTest(void *Ptr){    int *test = (GLfloat *)Ptr;    printf("C: test=%p\n", test);    printf("C: test[0]=%d\ntest[1]=%d\ntest[2]=%d\ntest[3]=%d\n", test[0], test[1], test[2], test[3]);}这是 Go 部分:test := []int{ 0, 3, 9, 81018 }var ptr unsafe.Pointer = (unsafe.Pointer)(&test)fmt.Printf("Go: test=%p\n", ptr)fmt.Printf("Go: test[0]=%d\ntest[1]=%d\ntest[2]=%d\ntest[3]=%d\n", test[0], test[1], test[2], test[3])C.passTest(ptr)结果是:Go: test=0x10300010Go: test[0]=0test[1]=3test[2]=9test[3]=81018C: test=0x10300010C: test[0]=271581216test[1]=4test[2]=4test[3]=0如您所见,指针值传递良好。但是,打印值是错误的。我在将数组传递给 C 时做错了什么吗?
查看完整描述

1 回答

?
慕的地6264312

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

这对于数组来说是正确的,但这里有一个 go 切片。使用第一个元素的地址来获取底层数组的地址

ptr := unsafe.Pointer(&test[0])


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

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