c ++ 11 ошибка экземпляра списка push_back ()? - PullRequest
0 голосов
/ 30 мая 2019

Я добавляю элементы в список 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)

1 Ответ

1 голос
/ 30 мая 2019

Проблема переменной-члена state, имеющей неправильные значения, возможно, связана с тем, что класс Sensor не инициализирует state при создании.

Таким образом, применение |= к неинициализированной переменной приведет к противоречивым или неправильным результатам.

Исправление, конечно, состоит в том, чтобы гарантировать, что члены имеют известное начальное значение при построении, в этом случае state должно быть 0 при инициализации Sensor.

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