Проблемы с классом отладки

Тема в разделе "Arduino & Shields", создана пользователем cfif, 8 май 2023.

  1. cfif

    cfif Нерд

    сделал два файла отладчика. Один содержит ссылки на объекты и с ним идет работа из main.cpp, также он вызывает функции из второго отладочного файла. А второй так и оставил как есть. Всё работает)
     
  2. Sergku

    Sergku Нерд

    Не могу я сути уловить... Дебагер, как я понял, временный класс, для отладки, для чего его включать в сшоп и продукт если его потом придется оттуда выпиливать
     
  3. cfif

    cfif Нерд

    ну у меня там идет флаг для отладки. И весь отладочный код пишется внутри блок #ifdef - #endif
    Код (C++):
    #ifdef SERIAL_DEBUG_ENABLE
    так что при выключенном флаге отладочный код в компиляцию не попадет. Но всё-равно ручками правлю, когда участок отдебажил.
    А как по-другому отладкой заниматься?
    Я разобрался со встроенным отладчиком, но у меня код уже большой получается и при отключенной оптимизации в настройках platformio.ini
    Код (C++):
    debug_build_flags = -O0 -g -ggdb ; чтобы не оптимизировал компиляцию. Иначе отладка глючит
    код не помещается на микроконтроллер
    Слышал про отладочные платы, но у меня ее нет и ни разу не пользовался такой штукой
     
  4. cfif

    cfif Нерд

    до этого просто в Serial выводил нужную информацию прям в том месте кода, где нужно было узнать данные. Потом, когда код сталь больше и таких мест стало много, вывел всё в отдельную функцию для вывода через Serial нужных данных. Потом перенес это в отдельный класс. Потом понадобилось принимать значения из Serial и менять настройки. Так потихоньку и разрослось всё))
     
  5. Sergku

    Sergku Нерд

    Serial.println("...."); Хватало всегда и для всего, мне лично
     
  6. parovoZZ

    parovoZZ Гуру

    В плане программирования ни чем не отличаются от обычных. Хоть самопальных, хоть каких. Отладочные - это значит весь GPIO вытащен наружу и доступен для подключения. В этом плане ардуины не являются отладками. Собственно, они так о себе и не заявляют))
     
    cfif нравится это.
  7. Asper Daffy

    Asper Daffy Иксперд

    Это не так делается. Например, у Вас есть нестатические свойства и методы, т.е. Вам нужен экземпляр. Но при этом у Вас конструктор private и никаких друзей нет, как Вы собрались экземпляр создавать?

    Но, об этом потом. Сейчас о Вашей проблеме с компиляцией.

    Ваша нынешняя проблема в том, что Вы не можете решить проблему "курицы и яйца". Вы используете Debuger в Procuct, а Product в Debuger. В результате, какой бы класс Вы не объявили первым, в нём будет использоваться ещё не объявленный второй класс.

    В этом случае, необходимо выбрать тот в класс (A) в котором другой (B) используется только как указатель и объявлять его первым. А для класса (B) сделать предварительное объявление выше определения класса A просто записав

    Код (C++):
    class B;

    class A {
       B * m_ptr;
       ...
    };

    class B {
       A m_AMember;
       ...
    };
    Нет там никакой концепции. Запомните твёрдо и не верьте никому, кто скажет, что это не так:

    Когда Вы пишете #include <filename> (или с кавычками - пофиг) - это ровным счётом тоже самое, как если бы Вы просто "вкопипастили" в это место указанный файл. И всё. Никаких других концепций там нет.
     
    Последнее редактирование: 19 май 2023
    cfif, BOOM и DetSimen нравится это.
  8. BOOM

    BOOM Нерд

    Лично я ещё дилетант в программировании, но мне кажется нужно отладочные методы в сами классы включать. Потом оптимизатор их всё равно выкинет из общего кода, а мороки меньше. Вообще смысл одного общего класса для отладки не понимаю. Это только усложняет всё.
     
    Asper Daffy нравится это.
  9. Asper Daffy

    Asper Daffy Иксперд

    Не только усложняет, а просто разрушает саму идею ООП о том, что всё связанное с классом, должно быть инкапсулировано в нём самом, и превращает программу в неуправляемое, труднопредсказуемое болото перемешанного кода.
     
    cfif, BOOM, arkadyf и ещё 1-му нравится это.