Не выполняется конструктор класса
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Столкнулся с проблемой, что конструктор внутри класса, который отрабатывает после создания экземпляра, не работает. Т.е. не выполняется код внутри него, или выполняется неправильно.
К примеру, в нем я пишу:
inertialSystem::inertialSystem() { _currentGyroScale = 2; _currentAccelerometerScale = 2; _currentOrientationMatrix[0][0] = 1.0; _currentOrientationMatrix[1][0] = 0.0; _currentOrientationMatrix[2][0] = 0.0; _currentOrientationMatrix[0][1] = 0.0; _currentOrientationMatrix[1][1] = 1.0; _currentOrientationMatrix[2][1] = 0.0; _currentOrientationMatrix[0][2] = 0.0; _currentOrientationMatrix[1][2] = 0.0; _currentOrientationMatrix[2][2] = 1.0; }
а в итоге получаю, что абсолютно все переменные устанавливаются в ноль, не только те, которым так предписано.
Созданный внутри методов класса Serial-debugger показывает, к примеру, что единичная матрица, заданная внутри конструктора, в итоге становится нулевой (т.е. не задается вообще), и методы, в которых используются переменные _currentGyroScale и _currentAccelerometerScale ведут себя так, словно эти переменные равны нулю:
Current orientation Matrix: 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
На самом деле, стоит пояснить, что это - лишь малая часть всех переменных, которые используются в классе и задаются в конструкторе, просто как "показательная часть". Все остальные переменные ведут себя точно так же.
Другое дело, что я нашел "неконвенциональное" решение этой проблемы - если поместить весь код конструктора в метод "инициализации", то все методы отрабатывают так, как и следует ожидать. Но ведь хочется сделать все "по ГОСТу"...
Стоит пояснить, что это - библиотека, написанная так, как описано в инструкции на этом же сайте, где создавался код морзе. Конструктор находится в .cpp файле.
В нахождении ошибок подобного типа, полный код - обязательное условие.
Полный код - 1000 строчек в .cpp файле. Оно вам надо - копаться в моем... быдлокоде?)
Я привел лишь часть того, что не выполняется правильно, чтобы показать суть проблемы. Я уверен, что эти переменные не устанавливаются в ноль где-то дальше в коде.
Вот где ТС увидел ГОСТы на скетч Ардуины. Я даже не могу представить что были ГОСТы для языка Си. И наконец структура скетча с setup() и loop() не очень вкладывается в нормы языка Си. Ну и так по мелочи. Вы что думаете что если в конструкторе вы вложете мигание светодиодом через delay() или millis(), то это и произойдет.
Ок. Разбирайтесь в своем "быдлокоде" сами.
Я кроме 16 строк похожих на коструктор класса ничего не увидел, ни сам класс, ни его иннициализацию, ни область видимости и тип _currentOrientationMatrix.
qwone, ГОСТ - я употребил образно. Следовало читать - "Хочется сделать так, чтобы все работало так, как ему и предписано".
xDriver, область видимости всех переменных - private, почти всех методов - public.
Новосозданный экземпляр является глобальным, как и экземпляры Servo, к примеру.
Метод инициализации - внутренний метод, который предписано выполнять перед началом работы с экземпляром, не стоит заострять на нем внимание.
Хотя, в общем, действительно нужно бы было скинуть код. Как я могу это сделать?
ctrl+A ctrl+C и в окне вставски кода ctrl+V.
Проблема наблюдается для глобального обекта?
Выше привел основные используемые методы, описанные в .cpp файле. Сначала - конструктор, потом инициализация, за ней - функция обработки данных. В функции инициализации многострочный комментарий в начале - по сути, копия того, что написано в конструкторе, и, если раскомментировать ее, то эта часть кода выполнится так, как ей следует, и программа будет работать так, как ей нужно. Не обращайте внимания на непонятные константы, они описаны выше в том же файле.
Далее .h файл, но особо интересного в нем мало:
Почти все методы, кроме тех, которые я привел в начале, НЕ ИСПОЛЬЗУЮТСЯ в тестовой программе.
ctrl+A ctrl+C и в окне вставски кода ctrl+V.
Проблема наблюдается для глобального обекта?
Видимо, для всех. Для локальных - попробовал создать локальный экземпляр в setup'е, для него произошло то же самое.
Такой скетч был использован для тестирования программы.
Все верно, это к вопросу выше о том, как область видимости влияет на работоспособность кода. Можете не обращать внимания на локальный экземпляр.
(Хотя, на самом деле, локальный экземпляр я дописал на ходу, вставляя код, ибо исходного скетча с тем экземпляром уже нет. Но он почти в точности повторяет то, что там было)
Сорри, говорю же, вставлял на скорую руку)
По другому оно бы не заработало в любом случае. Да, вместо initialize() должна быть initializeEquipment().
Ну в отличии от всякого творчества , программирование работа практическая. Всегда можно проверить на железе.У меня все в норме.Видно у вас в программе косяки.