Нарушение прав доступа при назначении значения элементу контейнера вектора карты - PullRequest
2 голосов
/ 01 ноября 2011

Я определил шаблонный класс следующим образом:

template <class T, size_t IR_CAL_LEVELS> 
class CCalibrationTable
{
public:
// Default Constructor/Destructor
    CCalibrationTable(void);
    ~CCalibrationTable(void) {}

// Implementation
    void Decode(const unsigned char* pszData);

protected:
    int  m_nActiveSensorID;                                        // Sensor selection 1-primary sensor, 2-backup sensor (11) I*1
    std::map<std::string, std::vector<T> > m_mapCalibrationTables; // Calibration tables such as VIS 64-level albedo cnversion table, and 
                                                                   // IR Level-temperature conversion tables.
private:
    static const size_t VIS_CAL_LEVELS;
    static const size_t NUM_OF_GROUPS;
};

template<class T, size_t IR_CAL_LEVELS> 
const size_t CCalibrationTable<T, IR_CAL_LEVELS>::VIS_CAL_LEVELS = 64;

template<class T, size_t IR_CAL_LEVELS> 
const size_t CCalibrationTable<T, IR_CAL_LEVELS>::NUM_OF_GROUPS = 25;

template<class T, size_t IR_CAL_LEVELS> 
CCalibrationTable<T, IR_CAL_LEVELS>::CCalibrationTable() 
{   
    // For VIS channels
    m_mapCalibrationTables.insert(std::make_pair("VIS1Cal", std::vector<T>(VIS_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("VIS2Cal", std::vector<T>(VIS_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("VIS3Cal", std::vector<T>(VIS_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("VIS4Cal", std::vector<T>(VIS_CAL_LEVELS, 0)));

    // For IR channels
    m_mapCalibrationTables.insert(std::make_pair("IR1Cal", std::vector<T>(IR_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("IR2Cal", std::vector<T>(IR_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("IR3Cal", std::vector<T>(IR_CAL_LEVELS, 0)));
    m_mapCalibrationTables.insert(std::make_pair("IR4Cal", std::vector<T>(IR_CAL_LEVELS, 0)));
}    

template<class T, size_t IR_CAL_LEVELS> 
void CCalibrationTable<T, IR_CAL_LEVELS>::Decode(const unsigned char* pszData)
{   
    // Sensor selection 1-primary sensor, 2-backup sensor (11) I*1 
    m_nActiveSensorID = CBCDDecoder::SINTn(1, &(pszData[CBCDDecoder::IndexI2D(11)]));

    for (size_t nVISLevel = 0; nVISLevel < VIS_CAL_LEVELS; nVISLevel++) 
    {   
        int nOffset = (nVISLevel << 2);

        m_mapCalibrationTables["VIS1Cal"][nVISLevel] = CBCDDecoder::REALnm(4, 6, &(pszData[CBCDDecoder::IndexI2D(257                             + nOffset)]));
        m_mapCalibrationTables["VIS2Cal"][nVISLevel] = CBCDDecoder::REALnm(4, 6, &(pszData[CBCDDecoder::IndexI2D(257 + (VIS_CAL_LEVELS << 2)     + nOffset)]));
        m_mapCalibrationTables["VIS3Cal"][nVISLevel] = CBCDDecoder::REALnm(4, 6, &(pszData[CBCDDecoder::IndexI2D(257 + (VIS_CAL_LEVELS << 2) * 2 + nOffset)]));
        m_mapCalibrationTables["VIS4Cal"][nVISLevel] = CBCDDecoder::REALnm(4, 6, &(pszData[CBCDDecoder::IndexI2D(257 + (VIS_CAL_LEVELS << 2) * 3 + nOffset)]));
    }

    for (int nIRLevel = 0; nIRLevel < IR_CAL_LEVELS; nIRLevel++)
    {   
        int nOffset = (nIRLevel << 2);

        m_mapCalibrationTables["IR1Cal"][nIRLevel] = CBCDDecoder::REALnm(4, 3, &(pszData[CBCDDecoder::IndexI2D(1281                            + nOffset)]));
        m_mapCalibrationTables["IR2Cal"][nIRLevel] = CBCDDecoder::REALnm(4, 3, &(pszData[CBCDDecoder::IndexI2D(1281 + (IR_CAL_LEVELS << 2)     + nOffset)]));
        m_mapCalibrationTables["IR3Cal"][nIRLevel] = CBCDDecoder::REALnm(4, 3, &(pszData[CBCDDecoder::IndexI2D(1281 + (IR_CAL_LEVELS << 2) * 2 + nOffset)]));
        m_mapCalibrationTables["IR4Cal"][nIRLevel] = CBCDDecoder::REALnm(4, 3, &(pszData[CBCDDecoder::IndexI2D(1281 + (IR_CAL_LEVELS << 2) * 3 + nOffset)]));
    }
}

Когда я использую этот вид шаблонного класса в другом классе, сначала объявляя следующее:

CCalibrationTable<double, 1024> m_CalibrationTable;

error (Место чтения нарушения доступа (0x00000004) произошло, когда декодированное значение было присвоено контейнеру векторной карты m_mapCalibrationTables.Как вы видите в его конструкторе, все ключи карты, а также их соответствующие векторные значения готовы (сохранены пробелы и инициализированы в 0).

Что не так с моим оператором присваивания, таким как "m_mapCalibrationTables [" VIS1Cal "] [nVISLevel] = XXXXX "?Вам лучше не сомневаться в возвращаемом значении моих декодеров, таких как REALnm и IndexI2D, которые просто возвращают двойные и целые значения соответственно.Я проверил эти возвращаемые значения, и они верны.

Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2011

Если я закомментирую

m_nActiveSensorID = CBCDDecoder::SINTn(1, &(pszData[CBCDDecoder::IndexI2D(11)]));

и измените все вызовы CBCDDecoder :: REALnm на постоянную «0». код работает нормально при компиляции с MSVC 2010. Я предполагаю, что у вас есть какой-то побочный эффект в ваших функциях CBCDDecoder или где-либо еще в коде, который выполняется между ctor и Decode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...