Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Go(golang)和C+之间交换数据结构(数组)+;_C++_Arrays_Go_Wrapper_Cgo - Fatal编程技术网

C++ 在Go(golang)和C+之间交换数据结构(数组)+;

C++ 在Go(golang)和C+之间交换数据结构(数组)+;,c++,arrays,go,wrapper,cgo,C++,Arrays,Go,Wrapper,Cgo,我试图将C++库连接到GO中编写的AppServer。目标是C++库和AppServer都在处理一个公共数据结构,这意味着: GO AppServer可以访问由C++库创建的数组。 C++库可以对GO AppServer .< /LIE创建的数组进行处理。 我玩了一些CGO和C++连接,所有的东西都工作了…然而,当涉及到交换指向数据结构的指针时,我就不知所措了。到目前为止,我尝试的是: //c++ library header: xyz.h #include <stdlib.h>

我试图将C++库连接到GO中编写的AppServer。目标是C++库和AppServer都在处理一个公共数据结构,这意味着:

  • GO AppServer可以访问由C++库创建的数组。
  • C++库可以对GO AppServer .< /LIE创建的数组进行处理。 <>我玩了一些CGO和C++连接,所有的东西都工作了…然而,当涉及到交换指向数据结构的指针时,我就不知所措了。到目前为止,我尝试的是:

    //c++ library header: xyz.h
    
    #include <stdlib.h>
    
    class CppLib {
     public:
      CppLib(unsigned int input);
    
      int * CreateArray();
    };
    
    //C++ library implementation: xyz.cpp
    #include "xyz.h"
    
    CppLib::CppLib(unsigned int input) {
        _input = input;
      }
    
    int * CppLib::CreateArray() {
        int values = 5;
        int * myPointer = new int [values];
        for (unsigned i = 0; i < values; ++i) {
            myPointer[i] = i;
        }
        return myPointer;
    }
    
    最后,go实现看起来像:

    //interface.h
    
    int * CCreateArray();
    
    //interface.cc
    #include "../lib/xyz.h"
    
    extern "C" {
    
      int * CCreateArray() {
        CppLib lib(1);
        return lib.CreateArray();
      }
    }
    
    package cgo_lib
    
    // #cgo CFLAGS: -I../lib
    // #cgo LDFLAGS: -L../lib -linterfacelib
    // #include "interface.h"
    import "C"
    
    func GoCreateArray() *int {
        return *int(C.CCreateArray())
    }
    
    编译时,我收到以下错误:

    # cgo_lib
    ../cgo_lib/cgo_lib.go:13: cannot convert _Cfunc_CCreateArray() (type *C.int) to type int
    ../cgo_lib/cgo_lib.go:13: invalid indirect of int(_Cfunc_CCreateArray()) (type int)
    
    我的问题是:如何在C++和GO之间交换指针到数据结构。上面我只是描述了C++的方式,但我也对另一方面感兴趣。

    非常感谢您的帮助。

    这里:

    return *int(C.CCreateArray())
    
    可以写成

    return *((int)(C.CCreateArray()))
    
    您正在取消引用一个
    int
    ,这将导致:

    invalid indirect of int(_Cfunc_CCreateArray()) (type int)
    
    在声明中,只注意这一部分:

    (int)(C.CCreateArray())
    
    您正在尝试将
    *C.int
    转换为
    int
    ,这将不起作用,因为第一个是指针,第二个不是指针

    除此之外,还有@tadman在您的问题评论中提到的内存管理问题,Go不像C那样将数组表示为指向其第一个元素的指针

    如果你想分享
    int
    s,你必须明确它们的宽度:围棋中的
    int
    具有拱门依赖的宽度,以及C
    int

    阅读有关CGO的更多信息:

    一旦您解决了所有这些问题,您将不得不进行如下操作:

    s := make([]int32, 0, 0)
    
    h := (*reflect.SliceHeader)((unsafe.Pointer)(&s))
    
    h.Data, h.Len, h.Cap = P, L, L // see below
    
    s = *(*[]int32)(h)
    

    <> > <代码> p>代码>是一个GO <代码> UINTPTR <代码>,您在C++中创建的代码,并且<>代码> L/COD> >数组的长度为GO <代码> int

    。您不能返回指向堆栈上分配的项的指针。这是完全无效的

    CreateArray
    需要使用
    new
    专门分配该数组。嗨,塔德曼,谢谢你的评论。是的,那是真的。。。谢谢你指出这一点。但即使使用new,问题的核心问题仍然存在,因为错误仍然存在。使用
    (*int)(C.CCreateArray())
    进行强制转换是否效果更好?不太熟悉围棋。我认为您无意中将其转换为
    int
    ,然后试图以某种方式取消引用。我也会尝试跳过显式演员阵容,看看Go是否能推断出这一点。不幸的是,不能。我仍然收到:
    无法将_Cfunc_CCreateArray()(type*C.int)转换为type*int
    感谢您指出这一点。在这种情况下,最好的选择是创建一个自己的空闲方法,使用
    delete[]
    释放内存。您好,谢谢您的回答。我可以让它完全按照你的帖子以及你链接的来源中的建议工作。剩下的唯一问题是:使用上述方法时,会收到一个C.int值数组。是否建议将它们转换为相应的go uint?是的,使它们成为go类型,无论是有符号还是无符号。如果您不这样做,那么您将不得不在整个Go代码中导入“C”。只需两个小的更正:第二行应该是--
    h:=*(*reflect.SliceHeader)((unsafe.Pointer)(&s))
    ——第四行应该是--
    s=*(*[]int32)(unsafe.Pointer(&h))