C++ 在Go(golang)和C+之间交换数据结构(数组)+;
我试图将C++库连接到GO中编写的AppServer。目标是C++库和AppServer都在处理一个公共数据结构,这意味着: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++ 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
具有拱门依赖的宽度,以及Cint
阅读有关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))