2011-11-01 36 views
2

我所定義的模板類,如下所示:訪問衝突分配一個值時,一個圖矢量容器的元件

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; 

錯誤(訪問衝突讀取位置0x00000004)當解碼值分配給我的地圖矢量容器m_mapCalibrationTables發生。正如您在其構造函數中看到的,所有映射鍵以及它們各自的向量值都已準備好(保留空間並初始化爲0)。

我的賦值語句(如「m_mapCalibrationTables [」VIS1Cal「] [nVISLevel] = XXXXX」)有什麼問題?你最好不要懷疑我的解碼器的返回值,比如REALnm和IndexI2D,它們分別只返回double和integer值。我檢查了這些返回值,它們是正確的。

預先感謝您!

+2

此代碼是否最小? (不知何故,我懷疑它。) – Beta

+0

誰擦除我的地圖矢量容器?我已經在構造函數中初始化了。但是當我在Decode函數中使用m_CalibrationTable時,它是一個空容器。爲什麼? – GoldenLee

+0

@Beta 2:感謝您關注我的問題。對不起,我遲到了,因爲這是我的午餐時間。 「這個代碼是最小的嗎?」你什麼意思?你能給我詳細的解釋嗎? – GoldenLee

回答

0

如果我註釋掉

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

,並切換到CBCDDecoder :: REALnm所有呼叫恆定的 「0」。在使用MSVC 2010進行編譯時,代碼運行良好。 我想你在CBCDDecoder函數或ctor和Decode之間運行的代碼中的任何其他地方都有一些副作用。

相關問題