gpt4 book ai didi

c++ - 为 map vector 容器的元素赋值时发生访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:39 27 4
gpt4 key购买 nike

我定义了一个模板类如下:

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;

将解码值分配给我的 map vector 容器 m_mapCalibrationTables 时发生错误(访问冲突读取位置 0x00000004)。正如您在其构造函数中所见,所有映射键及其各自的 vector 值都已准备就绪(保留空间并初始化为 0)。

我的赋值语句如“m_mapCalibrationTables["VIS1Cal"][nVISLevel] = XXXXX”有什么问题?你最好不要怀疑我解码器的返回值,比如REALnm和IndexI2D,它们分别只是返回double和integer值。我检查了这些返回值,它们是正确的。

提前致谢!

最佳答案

如果我注释掉

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

并将所有对 CBCDDecoder::REALnm 的调用更改为常量“0”。使用 MSVC 2010 编译时代码运行良好。我猜你的 CBCDDecoder 函数或在 ctor 和 Decode 之间运行的代码中的其他任何地方都有一些副作用。

关于c++ - 为 map vector 容器的元素赋值时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com