2013-07-26 3 views
3

사이 C.int을 공유 할 수 있습니다 내가이 다음 fastergo 패키지 golang : i는 기본 패키지에 패키지

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

내가 가진 :

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 

난 아니에요 날 여기를 말하려고하지만, 어떻게 든 내가 그것을 모든 C.int이 동일 아니라는 것을 말해 싶은 생각되어 가서 정말로 있는지? 왜 그런가요? 어떻게 해결할 수 있습니까/해결할 수 있습니까?

+0

두 가지 유형이 어떻게 든 다르게 보일 수 있습니다 (_Ctype_int 및 fastergo._Ctype_int). 나는 자아 어떻게 작동하는지 정확히 모르겠다. 그러나 C.int는 어디서 오는가? 가져온 패키지에서 가져온 것입니까? –

+0

@Laurent "C"는 C 코드를 사용하는 가상 패키지입니다. 읽기 : http://golang.org/doc/articles/c_go_cgo.html 기본적으로 정확히 동일한 유형 (C 언어 정수)을 두 번 언급하고 있으며 Go가이를 동일한 것으로 간주하지 않습니다. – mnagel

+0

'fastgo' 패키지에'_Ctype_int'를 정의한 다음, 지속적으로'fastergo._Ctype_int'라고합니다. 그들은 현재 다른 범위에 있습니다. – Intermernet

답변

4

_Ctype_int은 유니 코드 대문자로 시작하지 않으므로 유형은 패키지의 로컬 유형입니다. C 유형으로 변환하는 C 랩퍼 패키지를 제외하고 Go 유형을 사용하십시오. 래퍼 패키지는 모든 구현 세부 사항을 숨겨야합니다.

컴파일 및 실행되는 샘플 코드를 작성하는 데 충분한 정보를 제공하지 않습니다. 여기에 내가 기대했던 것의 대략적인 개요가 있습니다 :

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