2016-01-17 172 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])