3

メインパッケージには次のものがあります:

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

ここで何を伝えようとしているのかよくわかりませんが、どういうわけか、すべての C.int が等しくないことを伝えたいと思いますか? これはなぜですか?どうすればこれを解決できますか/回避できますか?

4

1 に答える 1

4

_Ctype_intは Unicode の大文字で始まっていないため、型はパッケージに対してローカルです。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
}
于 2013-07-26T23:50:39.483 に答える