LoginSignup
4
2

More than 5 years have passed since last update.

C言語の関数にsliceの中身をポインタとして渡す

Posted at
intSlice := []int{0, 1, 2, 3, 4}
some_func_requiring_intptr( (*C.int)(&intSlice[0]) )

引用元: Pass Go slices as C array parameters | coderwall

上のリンクではキャスト付いてないけど、実際に使ってみるとコンパイラに怒られたのでキャストしましょう

ポイントは

  • &slice[0]でポインタが取得できる(っぽい)
  • Goは型にうるさいのでキャストする

です

例を書いておく。cgoを使って、例えば以下のようなC言語の関数をラップすることを考える。

// 第一引数に入力の配列をとって、結果を第二引数に格納する。配列の長さは第三引数で指定する
void doSomething(double *inputBuffer, double *resultBuffer, const int sizeOfBuffer);

以下のように書く

// パッケージ名
package hoge

// #include <インクルードファイルの名前>
// LDFLAGS、pkg-config等、必要であれば書く
import "C"

func doSomethingInGo(inputBuffer []float64) []float64 {
    resultBuffer := make([]float64, len(inputBuffer))
    C.doSomething((*C.double)(&inputBuffer[0]), (*C.double)(&resultBuffer[0]), C.int(len(inputBuffer)))
    return resultBuffer
}

おわり

    resultBuffer := hoge.doSomethingInGo(inputBuffer)
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2