我正在做一个项目,在其中我定义了如下所示的数据类型
typedef QVector<double> QFilterDataMap1D;
typedef QMap<double, QFilterDataMap1D> QFilterDataMap2D;然后有一个名为mono_data的类,我在其中定义了这个变量
QFilterMap2D valid_filters;
mono_data Scan_data // Class现在,我从.mat文件中读取一个变量,并试图将其保存到"valid_filters“QMap之上。
Qt代码:开关视图
for(int i=0;i<1;i++)
{
for(int j=0;j<1;j++)
{
Scan_Data.valid_filters[i][j]=valid_filters[i][j];
printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]);
}
}成功地完成了传输,但随后给出了运行时错误。
Windows在SpectralDataCollector.exe中触发了一个断点。 这可能是由于堆损坏所致,并表示SpectralDataCollector.exe或其加载的任何DLL中存在错误。 输出窗口可能有更多的诊断信息。
有人能帮我解决这个问题吗。这对我有很大的帮助。
谢谢
发布于 2013-08-29 05:09:22
这里有不同的问题:
1.使用double作为QMap的键类型
使用QMap<double, Foo>是一个非常糟糕的主意。原因是,这是一个容器,允许您访问给定一个Foo的double。例如:
map[0.45] = foo1;
map[15.74] = foo2;这是有问题的,因为要检索map[key]中包含的数据,您必须测试key是否等于、小于或大于映射中的其他键。在您的例子中,关键是一个double,并测试两个doubles是否等于is not a "safe" operation。
2.在定义为双时使用int作为键
在此:
Scan_Data.valid_filters[i][j]=valid_filters[i][j];i是一个整数,您说过它应该是一个双倍。
3.只对(i,j) = (0,0)进行循环测试
你知不知道
for(int i=0;i<1;i++)
{
for(int j=0;j<1;j++)
{
Scan_Data.valid_filters[i][j]=valid_filters[i][j];
printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]);
}
}相当于:
Scan_Data.valid_filters[0][0]=valid_filters[0][0];
printf("\nValid_filters=%f",Scan_Data.valid_filters[0][0]);4.用operator[]访问向量是不安全的
当你这样做时:
Scan_Data.valid_filters[i][j]你实际上:
QFilterDataMap1D & v = Scan_Data.valid_filters[i]; // call QMap::operator[](double)
double d = v[j]; // call QVector::operator[](int)第一个是安全的,如果条目不存在,就创建它。第二个是不安全的,矢量中的jth元素必须已经存在,否则就会崩溃。
溶液
实际上,你似乎想要一个二维的双数组(即矩阵)。要做到这一点,请使用:
typedef QVector<double> QFilterDataMap1D;
typedef QVector<QFilterDataMap1D> QFilterDataMap2D;然后,当您想在另一个中传输时,只需使用:
Scan_Data.valid_filters = valid_filters;或者如果你想自己做的话
Scan_Data.valid_filters.clear();
for(int i=0;i<n;i++)
{
Scan_Data.valid_filters << QFilterDataMap1D();
for(int j=0;j<m;j++)
{
Scan_Data.valid_filters[i] << valid_filters[i][j];
printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]);
}
}如果你想要一个3D矩阵,你可以使用:
typedef QVector<QFilterDataMap2D> QFilterDataMap3D;https://stackoverflow.com/questions/18502371
复制相似问题