Переменная члена класса не обновляется
Код не обновляет переменную внутри метода привода. Переменная обновляется внутри метода привода, но не изменяется в остальной части класса. Я написал простой аналогичный метод на обычном C++, и переменная действительно обновилась в остальной части класса.
engine.hpp
#pragma once
#include <Arduino.h>
namespace engine
{
class Engine
{
public:
Engine(const unsigned char t_motor, const unsigned char t_forward, const unsigned char t_backward);
void drive(unsigned int t_speed, bool t_isForward = true);
bool isMovingForward() const;
void stop();
private:
const unsigned char m_motor;
const unsigned char m_forward;
const unsigned char m_backward;
// Движения
bool m_isActive;
bool m_isForward;
unsigned int m_speed;
};
} // механизм пространства имен
список инициализации engine.cpp
Engine::Engine(const unsigned char t_motor, const unsigned char t_forward, const unsigned char t_backward)
: m_motor(t_motor),
m_forward(t_forward),
m_backward(t_backward),
m_isActive(false),
m_isForward(true),
m_speed(0U)
{
}
метод привода
void Engine::drive(unsigned int t_speed, bool t_isForward)
{
if (!m_isActive || m_isForward != t_isForward)
{
stop();
// Установить направление
if (t_isForward)
{
digitalWrite(m_forward, HIGH);
digitalWrite(m_backward, LOW);
}
else
{
digitalWrite(m_forward, LOW);
digitalWrite(m_backward, HIGH);
}
m_isActive = true;
m_isForward = t_isForward;
}
if (m_speed != t_speed)
{
m_speed = t_speed; // Обновлено здесь
analogWrite(m_motor, t_speed);
}
}
@F--- it, 👍0
Обсуждение1 ответ
▲ 1
Я понял.
Я передавал объекты движка как ссылки, а не указатели.
main.cpp
// Двигатели
engine::Engine
engine1(motors::Constants::MOTOR_1, motors::Constants::MOTOR_1_FORWARD, motors::Constants::MOTOR_1_BACKWARD),
engine2(motors::Constants::MOTOR_2, motors::Constants::MOTOR_2_FORWARD, motors::Constants::MOTOR_2_BACKWARD),
engine3(motors::Constants::MOTOR_3, motors::Constants::MOTOR_3_FORWARD, motors::Constants::MOTOR_3_BACKWARD),
engine4(motors::Constants::MOTOR_4, motors::Constants::MOTOR_4_FORWARD, motors::Constants::MOTOR_4_BACKWARD);
список инициализации engine_controller.cpp
EngineController::EngineController(engine::Engine &t_e1, engine::Engine &t_e2, engine::Engine &t_e3, engine::Engine &t_e4)
: m_engine1(t_e1),
m_engine2(t_e2),
m_engine3(t_e3),
m_engine4(t_e4),
m_currentSpeed(EngineControllerConsts::MAX_SPEED),
// Направления
m_rights(0),
m_lefts(0),
m_rightDistance(-1),
m_leftDistance(-1),
m_lastForward(true),
m_counter(0),
m_lastForward1(true),
m_lastForward2(true),
m_turnsCounter(0)
{
}
Решением будет использование динамического выделения памяти.
main.cpp
// Двигатели
engine::Engine
*engine1 = new engine::Engine(motors::Constants::MOTOR_1, motors::Constants::MOTOR_1_FORWARD, motors::Constants::MOTOR_1_BACKWARD),
*engine2 = new engine::Engine(motors::Constants::MOTOR_2, motors::Constants::MOTOR_2_FORWARD, motors::Constants::MOTOR_2_BACKWARD),
*engine3 = new engine::Engine(motors::Constants::MOTOR_3, motors::Constants::MOTOR_3_FORWARD, motors::Constants::MOTOR_3_BACKWARD),
*engine4 = new engine::Engine(motors::Constants::MOTOR_4, motors::Constants::MOTOR_4_FORWARD, motors::Constants::MOTOR_4_BACKWARD);
список инициализации engine_controller.cpp
EngineController::EngineController(
engine::Engine *t_e1, engine::Engine *t_e2,
engine::Engine *t_e3, engine::Engine *t_e4)
: m_engine1(t_e1),
m_engine2(t_e2),
m_engine3(t_e3),
m_engine4(t_e4),
m_currentSpeed(EngineControllerConsts::MAX_SPEED),
// Направления
m_rights(0),
m_lefts(0),
m_rightDistance(-1),
m_leftDistance(-1),
m_lastForward(true),
m_counter(0),
m_lastForward1(true),
m_lastForward2(true),
m_turnsCounter(0)
{
}
,
@F--- it
Смотрите также:
- Как использовать SPI на Arduino?
- Подключение HX711 к трехпроводному датчику нагрузки
- Правильное использование * и & при передаче объектов в методах.
- ISO C++ запрещает принимать адрес неквалифицированной или заключенной в скобки нестатической функции-члена для формирования указателя на функцию-член
- Разница между массивом char и массивом unsigned char
- Печать содержимого файла SD - карты на ЖК-дисплее
- Отправка строки из RPi в Arduino - Рабочий код
- Сообщение об ошибке: "exit status 1 expected initializer before 'void'."
откуда ты знаешь, что он не обновлялся?, @Juraj
Какой код вы используете для проверки этого?, @chrisl
Я знаю, что он не обновлялся, потому что, когда я проверяю переменную m_speed после вызова метода привода, переменная m_speed возвращается к нулю., @F--- it
Понижение только за нецензурное имя пользователя. Есть какой-нибудь классный человек, @Delta_G