2016-01-20 3 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 * 'cast. –

+0

Для двоих вы никогда не проверяете результат 'dwResult', чтобы убедиться, что' 'MTMICRGetDevice' был успешным, прежде чем нажать' pcDevName' в вектор; если это не удастся, это объяснит, почему вы видите неинициализированный мусор. –

ответ

1

Это неудивительно.

char pcDevName[128]=""; выйдет за пределы сферы действия в конце функции vector<char*> Excella::getDevicesName(). Поэтому любые указатели на это, которые вы нажали на вектор, больше не будут действительны. Формально говоря, поведение вашей программы: 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