2016-01-20 71 views
0

我是新來的c + +,我在一個檢查掃描器的項目,我使用的掃描儀提供的API。這裏是我的代碼:數組指針的向量C++

.h文件中:

#include <iostream> 
#include<Windows.h> 
#include<vector> 

using namespace std; 
class Excella 
{ 
public: 
    vector<char*> getDevicesName(); 
}; 

.cpp文件:

vector<char*> Excella::getDevicesName() 
    { 
     DWORD dwResult; 
     vector<char*> listeDevices; 
     char pcDevName[128]=""; 
     int i = 6; 

// the device's name is stored in the variable 'pcDevName' 
     while ((dwResult = MTMICRGetDevice(i, (char*)pcDevName)) != MICR_ST_DEVICE_NOT_FOUND) { 
      dwResult = MTMICRGetDevice(i, (char*)pcDevName); 
      i++; 
      listeDevices.push_back((char*) pcDevName); 
     } 
     return listeDevices; 
    } 

的main.cpp

vector<char*> liste = excella.getDevicesName(); 
     if (liste.empty()!= true) 
     { 
      for (vector<char*>::iterator IterateurListe = liste.begin(); IterateurListe != liste.end(); ++IterateurListe) 
      { string str(*IterateurListe); 
       auto managed = gcnew String(str.c_str()); 
       devices->Items->Add(managed); 
      } 
     } 
     else { 
      MessageBox::Show("The vector is empty"); 
     } 

的問題是,我可以得到正確的設備號碼..我只是有一些怪異的字符。

謝謝你的幫助。

+0

你能否提供一些細節?你會得到什麼樣的怪異人物? – swinefish

+0

對於一個'pcDevName'已經是'char *'所以擺脫不需要的'char *'強制轉換。 –

+0

對於兩種情況,在將'pcDevName'推入向量之前,您從不檢查'dwResult'的結果以確保''MTMICRGetDevice'成功。如果失敗了,這將解釋爲什麼你看到未初始化的垃圾。 –

回答

1

這並不奇怪。

char pcDevName[128]="";將在功能vector<char*> Excella::getDevicesName()的末尾超出範圍。所以任何你已經推送到vector的指針都不再有效。從形式上講,你的程序的行爲是undefined

取而代之,使用std::vector<std::string>要簡單得多。值得注意的是,這是你必須做出的唯一改變:push_back((char*) pcDevName)將採用pcDevName的價值副本(這就是std::string構造函數的工作方式)。儘管放棄不必要的(char*)劇組。

+0

謝謝,問題解決了 – user5712010

1

這裏:

listeDevices.push_back((char*) pcDevName); 

你是推入listeDevices一個指針到堆疊陣列。有兩個問題 - 市長之一是,一旦你的getDevicesName函數結束,這些指針是無效的,使用它們是未定義的,另一個是在你的循環的每次迭代中,你覆蓋pcDevName以及你存儲的指針內容。

你應該做的是讓listeDevices存儲std :: string,即。 std::vector<std::string>,然後您可以使用listeDevices.push_back((char*) pcDevName);將您的名字安全地存儲在向量中。

+0

謝謝你的幫助 – user5712010