Застрял с этой проблемой. Возможность получить только первый член пройденной структуры ... Что я делаю неправильно? И какой правильный способ передать структуру от Go to C?Передача структуры и массива структур в функцию C из Go
Это мой пример того, как он не работает:
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])))
}
согласен с заключением об использовании типа C в явном виде. Просто примечание, 'int' golang не обязательно 64 бит; это * не менее * 32bit: http://golang.org/pkg/builtin/#int – Jonno