1

C互換ヘッダーを使用してC++ライブラリの関数を呼び出そうとしています。これにより、4x4行列を渡してデータを取り込む必要があります。

私のGo関数の定義は次のようになります。

func GetMatrix(matrix [][]float32)

func GetMatrix(matrix []float32)

そして、cヘッダーはそれを次のように定義します:

void getMatrix(const float **matrix)

C.GoBytesを使用してバイト配列を取得しようとしましたが、バイト配列からポインターの配列に移動し、それを再びバイトの配列に変換する必要があるため、そこから少し迷っています。そして最終的にはフロートの配列。

少なくとも、それが私がしなければならないことだと思います。

基になるGoスライスをC配列データに置き換えるコードの例を見てきましたが、そのような場合、GoGCはそれらを収集しないと思います。理想的には、行列[][]float32は通常のGoスライスのように動作します。

編集: ドキュメントが正しくなく、基になるCタイプは実際には16要素のfloat配列です。

したがって、問題は、配列のポインタへのポインタでC.GoBytesを使用できますか?もしそうなら、[]byteから[]float32を取得するにはどうすればよいですか?

4

5 に答える 5

1

編集済みこれは正しいものを印刷します

package main

/*
#include <stdio.h>
void getMatrix(const float **matrix){
    float *m = (float *)matrix;
    int i;
    for(i = 0; i<9; i++) {
        printf("%f\n",m[i]);
    }
}
*/
import "C"
import "unsafe"

func main() {
    a := []float32{1,2,3,4,5,6,7,8,9}
    C.getMatrix((**C.float)(unsafe.Pointer(&a[0])))
}
于 2012-10-05T17:17:17.110 に答える
1

go 配列へのポインターを C 関数に渡す方法を次に示します。これにより、C 関数はそれを設定できます。

package main
/*
#include <stdio.h>
void getMatrix(float *m) {
    int i;
    for(i = 0; i < 16; i++) {
        m[i] = (float)i;
    }
}
*/
import "C"
import "fmt"
func main() {
    var a [16]float32
    C.getMatrix((*C.float)(&a[0]))
    fmt.Println(a)
}
于 2013-04-04T20:45:25.727 に答える
0

Inuartによって提供された答えを拡張する:

package main

/*
#include <stdio.h>
void getMatrix(const float **matrix){
    float *m = (float *)*matrix;
    int i;
    for(i = 0; i<16; i++) {
       printf("%f\n",m[i]);
    }
}
*/
import "C"

import "unsafe"

func main() {
    // Create the contiguous 16 element array, but organise it how it is described.
    a := [4][4]float32{
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16},
    }
    m := &a // Take the pointer.
    C.getMatrix((**C.float)(unsafe.Pointer(&m))) // Take the handle and pass it.
}

これにより、求めているように見えるハンドル動作が得られ、Goのデータの形状がC APIによって求められているように見えるという利点があります。つまり、使いやすさと安全性を回避する必要はありません。 Cとインターフェースしているという理由だけで、行ってください。

于 2013-01-30T04:32:49.173 に答える
0

あなたが使わなければならないGoのタイプは

*[16]*float32

いずれにせよ、[][]float32 は C の **float と互換性がありません。

于 2012-05-23T21:55:59.857 に答える
0

配列の 4x4 配列へのポインターの型は*[4]*[4]float32です。

于 2012-05-24T06:25:55.403 に答える