我是c ++的新手,我正在检查扫描仪的项目,我正在使用随扫描仪提供的API。这是我的代码:
.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 :(得分:1)
这并不奇怪。
char pcDevName[128]="";
将超出函数vector<char*> Excella::getDevicesName()
末尾的范围。因此,您推送到向量的任何指针将不再有效。从形式上讲,程序的行为是 undefined 。
使用std::vector<std::string>
代替它简单得多。值得注意的是,这是您必须做出的唯一更改:push_back((char*) pcDevName)
将获取pcDevName
的值副本(这就是std::string
构造函数的工作方式)。删除不必要的(char*)
强制转换。
答案 1 :(得分:1)
下面:
String table = "beaconTable";
String whereClause = "_id" + "=?";
String[] whereArgs = new String[] { String.valueOf(row) };
db.delete(table, whereClause, whereArgs);
你正在向listeDevices推送一个指向堆栈数组的指针。这有两个问题 - 第一个问题是,一旦你的getDevicesName函数结束,那些指针是无效的,使用它们是未定义的,另一个是在你的循环的每次迭代中你覆盖pcDevName以及你存储的指针内容。
你应该做的是使listeDevices存储std :: string,即。 listeDevices.push_back((char*) pcDevName);
,然后您可以使用std::vector<std::string>
将您的名字安全地存储在矢量中。