0

我正在做一个项目,我在其中定义如下数据类型

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 中存在错误。

输出窗口可能有更多诊断信息

任何人都可以帮助解决这个问题。对我会有很大的帮助。

谢谢

4

1 回答 1

0

这里有不同的问题:

1. 使用 double 作为 QMap 的键类型

使用 aQMap<double, Foo>是一个非常糟糕的主意。原因是这是一个允许您访问Foo给定 a的容器double。例如:

map[0.45] = foo1;
map[15.74] = foo2;

这是有问题的,因为要检索 中包含的数据map[key],您必须测试是否key等于、小于或大于映射中的其他键。在您的情况下,键是 a double,并且测试两个doubles 是否相等不是“安全”操作

2. 使用 int 作为键,而你定义它是 double

这里:

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)

第一个是安全的,如果它不存在则创建条目。第二个不安全,向量中的第 j 个元素必须已经存在,否则它会崩溃。

解决方案

看来您实际上想要一个二维数组(即矩阵)。为此,请使用:

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;
于 2013-08-29T05:09:22.217 回答