3 回答

TA貢獻1795條經驗 獲得超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

TA貢獻1876條經驗 獲得超6個贊
這些答案現在都不起作用(至少在 Go 1.12 下)。我寫了另外兩個解決方案:
package main
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
int b;
} Foo;
int pass_array(Foo **in) {
int i;
int r = 0;
for(i = 0; i < 2; i++) {
r += in[i]->a;
r *= in[i]->b;
}
return r;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
type Foo struct {
A int32
B int32
}
func a() {
foos := []Foo{{1, 2}, {3, 4}}
l := len(foos)
values := (*[1 << 28]*C.Foo)(C.malloc(C.size_t(C.sizeof_Foo * l)))
for i, f := range foos {
foo := (*C.Foo)(C.malloc(C.size_t(C.sizeof_Foo)))
(*foo).a = C.int(f.A)
(*foo).b = C.int(f.B)
values[i] = foo
}
val := C.pass_array(&values[0])
for i := 0; i < l; i++ {
C.free(unsafe.Pointer(values[i]))
}
C.free(unsafe.Pointer(values))
fmt.Println("A finished", val)
}
func b() {
foos := []Foo{{5, 6}, {7, 8}}
values := make([]*C.Foo, len(foos))
for i, f := range foos {
p := (*C.Foo)(C.malloc(C.size_t(C.sizeof_Foo)))
values[i] = p
(*p).a = C.int(f.A)
(*p).b = C.int(f.B)
}
val := C.pass_array(&values[0])
for _, v := range values {
C.free(unsafe.Pointer(v))
}
fmt.Println("B finished", val)
}
func main() {
a()
b()
}
- 3 回答
- 0 關注
- 325 瀏覽
添加回答
舉報