0

以下のようなデータ型を定義する1つのプロジェクトを行っています

typedef QVector<double> QFilterDataMap1D;

typedef QMap<double, QFilterDataMap1D> QFilterDataMap2D;

次に、この変数を定義した mono_data という名前のクラスが 1 つあります。

QFilterMap2D valid_filters;



mono_data Scan_data // Class

現在、.mat ファイルから 1 つの変数を読み取り、それを上記の「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. QMap のキー タイプとして double を使用する

a を使用するのQMap<double, Foo>は非常に悪い考えです。Fooその理由は、これが特定のにアクセスできるコンテナだからですdouble。例えば:

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

に含まれるデータを取得するには、 がマップ内の他のキーと等しいか、小さいか、または大きいかmap[key]をテストする必要があるため、これは問題です。keyあなたの場合、キーは aであり、2 つの s が等しいdoubleかどうかをテストすることは「安全な」操作ではありませんdouble

2. double であると定義しているときに int をキーとして使用する

ここ:

Scan_Data.valid_filters[i][j]=valid_filters[i][j];

iは整数ですが、あなたは double であるべきだと言いました。

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)

最初のものは安全で、エントリが存在しない場合は作成します。2番目のものは安全ではありません.ベクトルのj番目の要素はすでに存在している必要があります.そうしないとクラッシュします.

解決

実際には double の 2D 配列 (つまり、行列) が必要なようです。これを行うには、次を使用します。

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 に答える