xlab / c-for-go

Automatic C-Go Bindings Generator for Go Programming Language
https://c.for-go.com
MIT License
1.5k stars 119 forks source link

How to handle a function returning a struct as value #137

Open bearsh opened 2 years ago

bearsh commented 2 years ago

I have following situation:

typedef struct {
    int A;
} member;

typedef struct {
    size_t size;    // size of array defined below
    type1* members; // pointer to an array of members
} members;

// function returning members as value
members get_members(void);

I've instructed c-for-go to generates MemTips if kind bind for member and members. the wrapper for get_members() looks ruffly like this:

func GetMembers() Memebrs {
    __ret := C.get_members()
    __v := *(*Members)(unsafe.Pointer(&__ret))
    return __v
}

now I have the following problems:

  1. GetMembers seems to return a wrongly initialized struct as it simply uses the c-structs pointer and casts it. changing it to:

    func GetMembers() Memebrs {
       __ret := C.get_members()
       return *NewMembersRef(unsafe.Pointer(&__ret)
    }

    seems to fix that...

  2. with the above fix, I can call .Deref() which sets the .Size member to value of the underlying c-struct but the .Members ([]Member) does not get filled in

do I miss an important instruction in the yaml file or is this simply a limitation on c-to-go?