Здесь разные проблемы:
<сильный>1. Использование двойного типа ключа для QMap
Использование QMap<double, Foo>
— очень плохая идея. причина в том, что это контейнер, который позволяет вам получить доступ к Foo
при наличии double
. Например:
map[0.45] = foo1;
map[15.74] = foo2;
Это проблематично, потому что затем, чтобы получить данные, содержащиеся в map[key]
, вы должны проверить, является ли key
равным, меньшим или большим, чем другие ключи в картах. В вашем случае ключ представляет собой double
и проверяет, равны ли два double
не является "безопасной" операцией.
<сильный>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-й элемент в вашем векторе уже должен существовать, иначе произойдет сбой.
Решение
Кажется, вам действительно нужен двумерный массив double (т.е. матрица). Для этого используйте:
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]);
}
}
Если вам нужна трехмерная матрица, вы должны использовать:
typedef QVector<QFilterDataMap2D> QFilterDataMap3D;
person
Boris Dalstein
schedule
29.08.2013