2013-07-26 50 views
3

之間共享C.int我有:golang:我可以在主包的包

var foo C.int 
foo = 3 
t := fastergo.Ctuner_new() 
fastergo.Ctuner_register_parameter(t, &foo, 0, 100, 1) 
在fastergo包

我有:

func Ctuner_register_parameter(tuner unsafe.Pointer, parameter *C.int, from C.int, to C.int, step C.int) C.int { 
    ... 
} 

,如果我嘗試運行它,我得到:

demo.go:14[/tmp/go-build742221968/command-line-arguments/_obj/demo.cgo1.go:21]: cannot use &foo (type *_Ctype_int) as type *fastergo._Ctype_int in function argument 

我真的不知道有什麼Go是試圖在這裏告訴我,但不知何故,我認爲它想告訴我,所有的C.int不相等?爲什麼會這樣?我該如何解決這個問題/解決問題?

+0

這兩種類型似乎不同(_Ctype_int和fastergo._Ctype_int)。我不確定cgo的工作原理,但C.int從哪裏來?它是否來自一些進口包裝? –

+0

@Laurent「C」是在go中使用C代碼的僞代碼。閱讀:http://golang.org/doc/articles/c_go_cgo.html基本上我指的是兩次完全相同的類型(一個C語言整數),Go沒有看到它們是等價的。 – mnagel

+0

嘗試在'fastergo'包中定義'_Ctype_int',然後一致地將其稱爲'fastergo._Ctype_int'。他們目前處於不同的範圍。 – Intermernet

回答

4

由於_Ctype_int不是以Unicode大寫字母開頭,所以類型是包的本地類型。使用Go類型,除了將它們轉換爲C類型的C wrapper包中。包裝程序包應該隱藏所有的實現細節。

您不能爲我們提供足夠的信息來創建編譯和運行的示例代碼。以下是我期望看到的一個粗略輪廓:

package main 

import "tuner" 

func main() { 
    var foo int 
    foo = 3 
    t := tuner.New() 
    t.RegisterParameter(&foo, 0, 100, 1) 
} 

package tuner 

import (
    "unsafe" 
) 

/* 
#include "ctuner.h" 
*/ 
import "C" 

type Tuner struct { 
    ctuner uintptr 
} 

func New() *Tuner { 
    var t Tuner 
    t.ctuner = uintptr(unsafe.Pointer(C.ctuner_new())) 
    return &t 
} 

func (t *Tuner) RegisterParameter(parameter *int, from, to, step int) error { 
    var rv C.int 
    rv = C.ctuner_register_parameter(
     (*C.ctuner)(unsafe.Pointer(t.ctuner)), 
     (*C.int)(unsafe.Pointer(parameter)), 
     C.int(from), 
     C.int(to), 
     C.int(step), 
    ) 
    if rv != 0 { 
     // handle error 
    } 
    return nil 
} 
+0

感謝您的好評,但請允許我檢查:'C'將C類型轉換爲程序包本地Go類型(由前導'_'指示),這些類型與其他程序包的類型本身不兼容 - 即使對於基本類型像'C.int'。解決方案是儘快轉換爲Go類型,並在其他地方使用Go類型(在包邊界上兼容)。這需要編寫一個乾淨的包裝。如果我想快速和骯髒,我可以複製和粘貼從'tuner'到'main'(意大利麪條樣式)的所有東西,事情也會起作用... – mnagel

+0

忘記提及你的名字,@peterSO – mnagel

+0

@peterSO:由於'ctuner uintptr'是小寫字母例如未導出),不聲明爲「ctuner * C.ctuner」的原因是什麼? – dmajkic

相關問題