亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將結構體和結構體數組從 Go 傳遞給 C 函數

將結構體和結構體數組從 Go 傳遞給 C 函數

Go
滄海一幻覺 2021-06-30 09:11:21
被這個問題困住了。只能獲得傳遞結構的第一個成員......我做錯了什么?將結構從 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])))}
查看完整描述

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


查看完整回答
反對 回復 2021-07-12
?
HUX布斯

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()

}



查看完整回答
反對 回復 2021-07-12
  • 3 回答
  • 0 關注
  • 325 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號