Я добавляю элементы в список c ++ 11 с помощью push_back (). Перед добавлением элемента я распечатываю отладочное сообщение через cout. Когда я сейчас удаляю оператор cout, значения в элементе, который я добавляю в список с помощью push_back, повреждены. Я могу проверить это с помощью googletest.
После вы видите рабочий код. Когда я закомментирую оператор cout, значения в последнем элементе sensor_scan_list кажутся испорченными. Ошибка, на мой взгляд, заключается либо в создании списка, либо в коде теста. Только переменная состояния current_sensor.state кажется поврежденной (см. Ниже).
Когда я оставляю оператор cout, все работает отлично. Это такая странная проблема, кто-нибудь знает, почему это может произойти?
фрагмент кода:
void MessageHandler::processSensorHeader(TelemetryMessageInterface * p_Message)
{
cout << "DEBUG: sensor header element added\n";
addSensorHeader(p_Message);
send_message(encoder->confirm(((SensorHeaderMessage *)p_Message)->getMessageId())); //ACK
}
void MessageHandler::addSensorHeader(TelemetryMessageInterface * p_message)
{
Sensor new_sensor;
new_sensor.manufacturerId = ((SensorHeaderMessage *)p_message)->getManufacturerId();
new_sensor.deviceId = ((SensorHeaderMessage *)p_message)->getDeviceId();
new_sensor.state |= SENSOR_HEADER_DETECTED;
sensor_scan_list.push_back(new_sensor);
}
Код Googletest:
TEST(MessageHandlerTest, processSensorHeader)
{
TelemetryEncoder * encoder = new TelemetryEncoder();
TelemetryMessageInterface * p_Message;
MessageHandler message_handler;
Sensor current_sensor;
list <Sensor> :: iterator p_List;
p_Message = encoder->encodeSensorHeader(0x0101,0x0202,0x0303);
//add sensor
message_handler.processSensorHeader(p_Message);
p_List = message_handler.sensor_scan_list.begin();
current_sensor = *p_List;
EXPECT_EQ(current_sensor.deviceId, 0x0303);
EXPECT_EQ(current_sensor.manufacturerId, 0x0202);
EXPECT_EQ(current_sensor.state, 1);
p_Message = encoder->encodeSensorHeader(0x0203,0x0302,0x0403);
//add new sensor
message_handler.processSensorHeader(p_Message);
current_sensor = *++p_List;
EXPECT_EQ(current_sensor.deviceId, 0x0403);
EXPECT_EQ(current_sensor.manufacturerId, 0x0302);
EXPECT_EQ(current_sensor.state, 1);
p_Message = encoder->encodeSensorHeader(0x0102,0x0202,0x0303);
message_handler.processSensorHeader(p_Message);
current_sensor = *++p_List;
EXPECT_EQ(current_sensor.deviceId, 0x0303);
EXPECT_EQ(current_sensor.manufacturerId, 0x0202);
EXPECT_EQ(current_sensor.state, 1);
}
Класс датчика:
class Sensor : public sensor_interface {
public:
Sensor();
virtual ~Sensor();
uint16_t manufacturerId;
uint16_t deviceId;
char name[SENSOR_INFORMATION_LENGTH];
uint8_t state;
};
Вывод Googletest для неработающего кода (комментарий зарезервирован):
[ RUN ] MessageHandlerTest.processSensorHeader
../test/inc/test_messageHandler.cpp:77: Failure
Expected: current_sensor.state
Which is: '\xC1' (193)
To be equal to: 1
../test/inc/test_messageHandler.cpp:93: Failure
Expected: current_sensor.state
Which is: '\xF1' (241)
To be equal to: 1
[ FAILED ] MessageHandlerTest.processSensorHeader (0 ms)