2014-04-04 89 views
0

我正在開發一個DLL(在Visual Studio 2013中)讀取TIFF(衛星圖像),使用GDAL庫,並有一個問題找回我的變量與數據 - 目前它是空的返回NULL)。指針類變量返回NULL從muncion

在我的DLL我在 「RasterFuncs.h」 定義我funcion這樣的:

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。

不過,我打電話使用下面的代碼此DLL形成另一個CPP:

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。

有人可以幫助解決這個問題嗎?

在此先感謝和問候!

回答

2

請記住,默認情況下,函數的參數值的值爲,表示該函數具有該值的副本。

當您在功能中指定poDataset變量時,您只需更改本地副本。調用函數不會看到這個修改。您需要通過參考來傳遞參數

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

大!!你是對的!謝謝你的幫助! – user3468473

0

約阿希姆是點上,但在另一面,你可以將指針傳遞到指針,而不是指針引用。我不會參與指針與參考戰爭,因爲兩者都很好理解。

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

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

( 「**」 表示 「指針的指針」 和 「&」 是指 「的地址」)

+0

如果從另一個模塊調用DLL,並且如果有可能使用與DLL不同的構建設置構建其他模塊,那麼最安全的路由是將指針傳遞給指針。什麼是「引用foo」的底層實現是由編譯器決定的。它可能是一個簡單的指針,但它可能不是。最好是安全並在模塊邊界使用指針。 – PaulMcKenzie