c-for-go icon indicating copy to clipboard operation
c-for-go copied to clipboard

How to handle a function returning a struct as value

Open bearsh opened this issue 2 years ago • 0 comments

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?

bearsh avatar Nov 16 '22 09:11 bearsh