如何将Go数组传递给C?

时间:2016-01-17 13:53:28

标签: go

我正在努力使用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=0x10300010
Go: test[0]=0
test[1]=3
test[2]=9
test[3]=81018
C: test=0x10300010
C: test[0]=271581216
test[1]=4
test[2]=4
test[3]=0

如您所见,指针值传递良好。但是,印刷价值是错误的。 将数组传递给C,我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

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