【问题标题】:Pointer class variable returns NULL from muncion指针类变量从 muncion 返回 NULL
【发布时间】:2014-04-04 13:00:16
【问题描述】:

我正在开发一个 DLL(在 Visual Studio 2013 中)来读取 TIFF(卫星图像),使用 GDAL 库,并且在用数据取回我的变量时遇到问题 - 目前它是空的(返回 NULL)。

在我的 DLL 中,我在“RasterFuncs.h”中定义了我的函数,如下所示:

namespace RasterFuncs
{
    // This class is exported from the RasterFuncs.dll
    class MyRasterFuncs
    {
    public:
        // Open a raster file
        static RASTERFUNCS_API int Open(char* rname, GDALDataset *poDataset);
    };
}

在我的 DLL cpp 中,我有以下内容:

namespace RasterFuncs
{
    int MyRasterFuncs::Open(char* rname, GDALDataset *poDataset)
    {
        poDataset = (GDALDataset *) GDALOpen(rname, GA_ReadOnly);

        if (poDataset != NULL)
        {
            cout << "RasterXSize 1:" << poDataset->GetRasterXSize() << endl;
            cout << "RasterYSize 1:" << poDataset->GetRasterYSize() << endl;
            cout << "RasterCount 1:" << poDataset->GetRasterCount() << endl;
        }
        return 0;
    }
}

此时我拥有包含所有图像数据的 poDataset。

但是,我使用以下代码从另一个 CPP 调用此 DLL:

    rfileName = "C:/Image1.tif";

    // Open raster satelitte image
    GDALDataset *poDataset = NULL;
    GDALAllRegister();
    RasterFuncs::MyRasterFuncs::Open(rfileName, poDataset);

    if (poDataset != NULL)
    {
        cout << "RasterXSize:" << poDataset->GetRasterXSize() << endl;
        cout << "RasterYSize:" << poDataset->GetRasterYSize() << endl;
        cout << "RasterCount:" << poDataset->GetRasterCount() << endl;
    }

当我测试返回的 poDataset 时,显示为 NULL。

有人可以帮忙解决这个问题吗?

提前致谢并致以最诚挚的问候!

【问题讨论】:

    标签: c++ function class pointers dll


    【解决方案1】:

    请记住,默认情况下,函数的参数是按值传递的,这意味着函数有一个值的副本。

    当您在函数中分配给poDataset 变量时,您只是在更改您的本地副本。调用函数不会看到这个修改。您需要通过引用传递参数

    static RASTERFUNCS_API int Open(char* rname, GDALDataset*& poDataset);
    

    【讨论】:

      【解决方案2】:

      Joachim 是正确的,但另一方面,您可以将指针传递给指针,而不是指针的引用。我不会进入指针与引用之战,因为两者都很容易了解和理解。

      static RASTERFUNCS_API int Open(char* rname, GDALDataset **poDataset);
      

      RasterFuncs::MyRasterFuncs::Open(rfileName, &poDataset);
      

      (“**”表示“指向指针的指针”,“&”表示“地址”)

      【讨论】:

      • 如果对 DLL 的调用是从另一个模块进行的,并且如果有可能使用与 DLL 不同的构建设置来构建另一个模块,那么最安全的方法是传递一个指针到一个指针。 “对 foo 的引用”的底层实现由编译器确定。它可能是一个简单的指针,但同样,它可能不是。最好是安全的并使用跨模块边界的指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多