Как перенести сложную структуру C в C из Go - PullRequest
0 голосов
/ 30 мая 2020

Я пишу gobinding для частного проекта

есть typedef struct как это.

typedef struct {
skynet_risk_t risk;
.....
const void *unknown[13];
} skynet_result_t;

когда я пытаюсь передать эту структуру в забаву c skynet_status_t skynet_classify( ......, skynet_result_t *result);

Я пишу вот так

result := C.skynet_result_t{}
status = C.skynet_classify(
    ...
    &result,
)

Получил cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify

но когда пишу весело c вот так

void print_skynet_result(skynet_result_t *result){
    // do nothing
}

и я называю это таким же образом.

result := C.skynet_result_t{}
C.print_skynet_result(&result)

скомпилировать, и все в порядке. в чем проблема, с которой я столкнулся

Я не знаю, почему cgo говорят, что это (type *_Ctype_char)

1 Ответ

0 голосов
/ 31 мая 2020

компилятор всегда говорил:

./skynet.go:266:14: cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify

строка - ошибка ... Я никогда не думал об этом.

оригинальное развлечение c определите так.

skynet_status_t skynet_classify(skynet_request_t *req,
skynet_classify_type_t type,
const void *data,
size_t length,
skynet_result_t *result);

и я определяю оболочку, подобную этой.

func (s *skynetRequest) Classify(t uint32, data []byte) (*skynetResult, error) {
    var result skynetResult
    // var temp = C.pass_skynet_result_t((*C.skynet_result_t)(&result))
    var status = C.skynet_classify(
        (*C.skynet_request_t)(s),
        (C.uint)(t),
        unsafe.Pointer(&data[0]),
        C.ulong(len(data)),
        (*C.skynet_result_t)(&result),
    )
    if status != 0 {
        return &result, errors.New("classify error")
    }
    return &result, nil
}

@ user2089648 напомнил мне, это может не вызывается параметром результата, но может быть вызвано другим параметром , тогда я считаю, что const void *data должен передаваться следующим образом unsafe.Pointer(&data[0]) , оболочка работает хорошо.

...