ここでのさまざまな問題:
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;