首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将复杂的C结构从Go转换为C

如何将复杂的C结构从Go转换为C
EN

Stack Overflow用户
提问于 2020-05-30 08:53:38
回答 1查看 93关注 0票数 0

我正在为一个私人项目编写gobinding

有一个这样的typedef struct

代码语言:javascript
复制
typedef struct {
skynet_risk_t risk;
.....
const void *unknown[13];
} skynet_result_t;

当我尝试将此结构传递到函数skynet_status_t skynet_classify( ......, skynet_result_t *result);中时

我是这样写的

代码语言:javascript
复制
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

但是当我写一个这样的函数时

代码语言:javascript
复制
void print_skynet_result(skynet_result_t *result){
    // do nothing
}

我用同样的方式来称呼它。

代码语言:javascript
复制
result := C.skynet_result_t{}
C.print_skynet_result(&result)

编译通过,一切都是正常的。我遇到的麻烦是什么

我不知道为什么cgo说这是一个(type *_Ctype_char)

EN

回答 1

Stack Overflow用户

发布于 2020-05-31 09:18:41

编译器总是说

代码语言:javascript
复制
./skynet.go:266:14: cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify

该行为error……我从来没想过这个。

原始函数定义如下。

代码语言:javascript
复制
skynet_status_t skynet_classify(skynet_request_t *req,
skynet_classify_type_t type,
const void *data,
size_t length,
skynet_result_t *result);

我定义了一个类似这样的包装器。

代码语言:javascript
复制
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提醒我,这可能不是由result参数引起的,而可能是由其他参数引起的,然后我发现const void *data应该像这个unsafe.Pointer(&data[0])一样传输,包装器工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62096566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档