10

この問題で立ち往生。渡された構造の最初のメンバーのみを取得できます...何が間違っていますか? Go から C に構造体を渡す正しい方法は何ですか?

これがうまくいかない私の例です:

package main

/*
#include <stdio.h>

typedef struct {
    int a;
    int b;
} Foo;

void pass_array(Foo **in) {
    int i;

    for(i = 0; i < 2; i++) {
        fprintf(stderr, "[%d, %d]", in[i]->a, in[i]->b);
    }
    fprintf(stderr, "\n");
}

void pass_struct(Foo *in) {
    fprintf(stderr, "[%d, %d]\n", in->a, in->b);
}

*/
import "C"

import (
    "unsafe"
)

type Foo struct {
    A int
    B int
}

func main() {

    foo := Foo{25, 26}
    foos := []Foo{{25, 26}, {50, 51}}

    // wrong result = [25, 0]
    C.pass_struct((*_Ctype_Foo)(unsafe.Pointer(&foo)))

    // doesn't work at all, SIGSEGV
    // C.pass_array((**_Ctype_Foo)(unsafe.Pointer(&foos[0])))

    // wrong result = [25, 0], [50, 0]
    out := make([]*_Ctype_Foo, len(foos))
    out[0] = (*_Ctype_Foo)(unsafe.Pointer(&foos[0]))
    out[1] = (*_Ctype_Foo)(unsafe.Pointer(&foos[1]))
    C.pass_array((**_Ctype_Foo)(unsafe.Pointer(&out[0])))
}
4

3 に答える 3

7

問題は、Foo_Ctype_Fooが異なる構造であることです。

64ビットで実行していると思います。intgo では 64 ビットですが、C では 32 ビットである可能性が非常に高いことに注意してください。

の定義をFooこれに変更すると、私のマシン (64 ビット Linux) で動作します。

type Foo struct {
    A int32
    B int32
}

ただし、それはトラブルのレシピだと思います-GoとCのコードで同じ構造を使用してください

type Foo _Ctype_Foo
于 2013-11-11T16:38:12.183 に答える