C 使用SWIG:如何将C 指针传递到

C++ to Go using SWIG: How to pass C++ pointers to Go?

本文关键字:指针 使用 SWIG      更新时间:2023-10-16

请参见下面的代码,我将解释

int* Camera::retrieveDataPointerPerBuffer() {
    int cameraData [10] = {1,2,3,4,5,6,7,8,9,10};
    int* pSrc = cameraData;
    return cameraData; 
} //camera.cpp

上面的代码具有插入指针PSRC指向数组,然后返回。这是C 的功能。接下来,我使用SWIG本质上包装了此C 功能,因此我可以在Go中称呼它。以下代码演示了在GO中调用的函数。

func myCamera() {
    cam := camera.NewCamera()
    pSrc := cam.RetrieveDataPointerPerBuffer()
    for i := 0; i < 10; i++ {
        fmt.Println("%d", pSrc)
    }
} //main.go

注意:我知道我不能迭代Go中的指针。但是有什么办法?

输出:0

问题:如何通过C 指针访问数组元素?其他信息:这是我正在从事的较大项目的简化版本。我必须返回此指针,我不能返回向量。

让我知道您是否需要我为您澄清任何东西。

@jimb感谢您的所有资源。我发现了它,这似乎可以解决问题。

int* Camera::retrieveDataPointerPerBuffer() {
   int cameraData [10] = {1,2,3,4,5,6,7,8,9,10};
   int* pSrc = cameraData;
   return cameraData; 
} //camera.cpp

下面包含我所做的更改

func myCamera() { //For Goroutine
   cam := camera.NewCamera()
   pSrc := cam.RetrieveDataPointerPerBuffer()
   arraySize := 10
   slice := (*[1 << 30]C.int)(unsafe.Pointer(pSrc))[:arraySize:arraySize]
   fmt.Println(slice)
}

输出:[1、2、3、4、5、6、7、8、9、10]

后续问题:有人介意解释这条代码吗?

slice := (*[1 << 30]C.int)(unsafe.Pointer(pSrc))[:arraySize:arraySize]