2016-01-17 137 views
0

我一直在用OpenGL ES挣扎。它运作不好。 (我只是复制Go代码和修改(语法),并删除(非重要的函数调用)一些事情的C.)如何将Go数组传递给C?

我终于发现,数组没有传递给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]); 
} 

这就是转到部分:

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?

+0

您正在传递一段'int'(它可能是int32或int64,具体取决于系统),并将它们解释为' GLfloat'。因为你使用'unsafe',所以你需要确保你的类型匹配。 – JimB

回答

0

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

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