首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMap内存错误

QMap内存错误
EN

Stack Overflow用户
提问于 2013-08-29 04:35:59
回答 1查看 952关注 0票数 0

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

代码语言:javascript
复制
typedef QVector<double> QFilterDataMap1D;

typedef QMap<double, QFilterDataMap1D> QFilterDataMap2D;

然后有一个名为mono_data的类,我在其中定义了这个变量

代码语言:javascript
复制
QFilterMap2D valid_filters;



mono_data Scan_data // Class

现在,我从.mat文件中读取一个变量,并试图将其保存到"valid_filters“QMap之上。

Qt代码:开关视图

代码语言:javascript
复制
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中存在错误。 输出窗口可能有更多的诊断信息。

有人能帮我解决这个问题吗。这对我有很大的帮助。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-29 05:09:22

这里有不同的问题:

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

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

代码语言:javascript
复制
map[0.45] = foo1;
map[15.74] = foo2;

这是有问题的,因为要检索map[key]中包含的数据,您必须测试key是否等于、小于或大于映射中的其他键。在您的例子中,关键是一个double,并测试两个doubles是否等于is not a "safe" operation

2.在定义为双时使用int作为键

在此:

代码语言:javascript
复制
Scan_Data.valid_filters[i][j]=valid_filters[i][j];

i是一个整数,您说过它应该是一个双倍。

3.只对(i,j) = (0,0)进行循环测试

你知不知道

代码语言:javascript
复制
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]);
    }
}

相当于:

代码语言:javascript
复制
Scan_Data.valid_filters[0][0]=valid_filters[0][0];
printf("\nValid_filters=%f",Scan_Data.valid_filters[0][0]);

4.用operator[]访问向量是不安全的

当你这样做时:

代码语言:javascript
复制
Scan_Data.valid_filters[i][j]

你实际上:

代码语言:javascript
复制
QFilterDataMap1D & v = Scan_Data.valid_filters[i]; // call QMap::operator[](double)
double             d = v[j];                       // call QVector::operator[](int)

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

溶液

实际上,你似乎想要一个二维的双数组(即矩阵)。要做到这一点,请使用:

代码语言:javascript
复制
typedef QVector<double> QFilterDataMap1D;
typedef QVector<QFilterDataMap1D> QFilterDataMap2D;

然后,当您想在另一个中传输时,只需使用:

代码语言:javascript
复制
Scan_Data.valid_filters = valid_filters;

或者如果你想自己做的话

代码语言:javascript
复制
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矩阵,你可以使用:

代码语言:javascript
复制
typedef QVector<QFilterDataMap2D> QFilterDataMap3D;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18502371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档