Ах, эти страшные, сложные, милые, простые классы.

Тема в разделе "Флудилка", создана пользователем DetSimen, 16 янв 2018.

  1. DetSimen

    DetSimen Guest

    дальше будем расширять, улучшать, и делать класс устойчивым.
     
  2. DIYMan

    DIYMan Guest

    Скажу лишь, что под Mega2560 поля инициализируются нулями, а вот если компилировать под Due - фигушки, эта фигня в своё время попила кровушки. Так что теперь - только принудительно инициализирую, так спокойней ;)
     
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    хороший материал. спасибо. если бы про Stringи, так же бы разжевали по полочкам. А то или я не те книжки смотрю, или процессор не очень шустрый. но многое не вкуриваю. в книжках сухо даны функции с кратким описанием, но нигде не разжевано, как и когда их пременять. большой минус самообразования что надо долго сидеть и осмысливать что бы значило то или иное выражение. А у вас получилось все ясно и доступно объяснить. Удачи в написании продолжения
     
    ИгорьК нравится это.
  4. DIYMan

    DIYMan Guest

    String в Arduino IDE - это простой класс С++, подобных классов-обёрток над массивом байт - тонны можно найти и написать самому, если уж вдруг приспичит. Исходники этого класса - есть в поставке IDE, можно посмотреть, как там всё реализовано.
     
    CYITEP_BAC9I нравится это.
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    если много опыта то да). а когда первый раз сталкиваешся то спиться можно пока разберешся) особенно когда надо из строки выдернуть нужные цифры. тот же баланс на GSM модуле. пока сообразил как выдернуть нужное значение чуть завывать не стал). в том году даже начал ходить на вечерние курсы программистов. Как было написано в обьявлении при местном колледже. Смутные сомнения начали терзать когда в течении 3 занятий делали квадратную кнопку с надписью внутри. на 4 занятии я попросил методичку по которой учили группу "охлов". и увидел что вершиной программирования на этих курсах будет создание программики таблицы по учету успеваемости. плюнул на эти курсы и вечерами стараюсь по пол часика грызть С++
     
  6. Тоже типо того. В школе факультатив по с++. Походил с месяц, посмотрел, ничего нового не узнал :) больше не хожу
     
  7. DIYMan

    DIYMan Guest

    Скажу по личному опыту: для того, чтобы научиться программировать, надо избавиться от дурной привычки сначала делать, а потом, когда не получается - читать инструкцию. Вместо этого завести привычку - сначала читать документацию на тот или иной класс/API/функционал - а потом уже - писать.

    Я не зря упоминал, что исходники всех классов - в поставке Arduino IDE, и можно, и даже нужно, их читать, чтобы понять, как что устроено и работает.

    Ессно, не стоит манкировать книжками по С++ - основы языка надо знать. И именно бумажная книжка, имхо - тут роляет больше всего.
     
    CYITEP_BAC9I и БАРМАТОГРАФ нравится это.
  8. DetSimen

    DetSimen Guest

    прошу прощения, пока только одним пальчиком печатаю. Продолжение будет...
     
    CYITEP_BAC9I нравится это.
  9. railmisaka

    railmisaka Гик

    Вставлю свои 5 копеек - если мы говорим про так называемые базовые типы - то они инициализируются нулями только в случае их статичности. Т.е. нестатичные поля класса иниализируются мусором - перед тем как читать надо инициализировать. Лучше всего все переменные инициализировать в конструкторе (а еще лучше списком инициализации).

    Если же поле класса - объект некоторого класса то при создании объекта будет вызван конструктор.
    Если такой параметр присутствует в списке инициализации то будет вызван соответствующий конструктор. Если в списке инициализации его нет - будет вызван конструктор по-умолчанию.

    Это по стандарту, честно говоря не знаю точно чем "arduino диалект" отличается.

    Вообще парсинг сама по себе задача не тривиальная.
    Ну а про курсы - лучше посмотрите в сторону интернет курсов.

    Я бы еще добавил - ищите примеры, или даже лучше пробуйте найти именно то, что вам нужно - ведь как известно все уже написано за вас и лучше вас. Да, сейчас я уже могу разбираться по документации, но раньше примеры давали гораздо больше.
     
    Последнее редактирование: 27 янв 2018
    CYITEP_BAC9I нравится это.
  10. Securbond

    Securbond Гуру

    Прочитал, пытаюсь понять что и куда... Допустим мне нужно выводить текст на матрицу светодиодов и я хочу упаковать это всё в класс.
    Итак.... как я понял необходимые для работы библиотеки я должен подключить в файле .h ... Примерно так

    Код (C++):

    #pragma once
    #include "Arduino.h"
    #include <Adafruit_GFX.h>
    #include <Adafruit_NeoMatrix.h>
    class MatrixTxt
    {
    }

    Для того что бы матрица что то выводила, мне нужно передать ей номер пина, к которому она подключена и текст String. Возвращать по идее класс ничего не будет. Получил инфу и вывел её на матрицу.
    И теперь наш .h выглядит так
    Код (C++):
    #pragma once
    #include "Arduino.h"
    #include <Adafruit_GFX.h>
    #include <Adafruit_NeoMatrix.h>

    class MatrixTxt
    {
      protected:
       byte fpin;
       String fmtext;
      public:
      MatrixTxt(byte apin);
      MatrixTxt(String amtext) ;
    }

    А файл с.
    Код (C++):
    //-------------------------------------
    // срр файл

    #include "MatrixTxt.h"  

    MatrixTxt::MatrixTxt(byte apin)
    {
      fpin = apin;
    }
    MatrixTxt::MatrixTxt(String amtext)
    {
      fmtext = amtext;
    }

    Далее начинаем наполнять файл cpp необходимым содержимым.........
    Правильно ли я всё понял ? Поправьте если что то не так ....
     
  11. railmisaka

    railmisaka Гик

    Во-первых лучше не подключать в хедере лишние заголовки, а подключать только то, что используется именно в хедере (а еще знать про forward declaration, может пригодиться при сложной структуре зависимостей).

    Во-вторых у Вас два конструктора, которые принимают либо пин, либо строку. Если вы хотите класс, который просто выводит одну фиксированную строку (или есть некоторая строка по-умолчанию), то вам логичнее создать один конструктор
    Код (C++):
    MatrixTxt(byte apin, String amtext);
    либо использовать функции инициализаторы
    Код (C++):
    void setPinNumber(byte apin);
    void setText(String amtext);

    Лично мне не вполне понятны цели, которые вы преследуете при написании вашего класса.
    Дело в том, что класс это некоторая целостная сущность, и при создании класса есть конкретная цель.
    Приведу пример:
    * класс для упрощения вывода символа в любую позицию матрицы светодиодов
    * класс для реализации "бегущей строки" на матрице светодиодов

    Кроме того, несмотря на то, что я не знаю как точно следует работать с Adafruit, но зачастую создаются некоторые объекты, помогающие осуществлять доступ. Так вот, если такие объекты необходимы, они должны быть полями вашего класса.
     
  12. Securbond

    Securbond Гуру

    Нет строка как раз всегда разная иначе класс не имеет смысла. Класс именно для вывода бегущей строки в матрицу.
    Так как для вывода нужно ещё знать длинну строки то класс должен получить строку, измерить её длинну, рассчитать пиксели на символ и сформировать вывод на матрицу.
     
  13. railmisaka

    railmisaka Гик

    Если это бегущая строка, то ваш класс должен работать с временем (бегущая строка по сути - анимация).
    Получается что кроме задания параметров для отображения нужно еще каким то образом поставлять в класс информацию о времени.

    Как бы я поступил если бы передо мной стояла задача написать подобный класс:

    * Конструктор принимает только информацию об устройстве (пины etc)
    * Метод
    Код (C++):
    void setText(String text);
    * Опционально метод
    Код (C++):
    void setAnimationStepsPerSecond(float steps)
    Далее я бы использовал что-то вроде кооперативной многозадачности.
    Коротко идея:
    • В loop функции по очереди дергается update метод у всех текущих задач
    • В методе update у задачи есть возможность узнать время, прошедшее с момента последнего update, а также события в системе
    • Метод update каждой задачи должен быть коротким (по времени)
    Таким образом в методе update вашего класса бегущей строки я бы смотрел сколько времени прошло, вычислял на сколько шагов надо сдвинуть надпись, двигал. (потребуется внутренняя переменная-счетчик времени от последнего сдвига)

    Надеюсь, не очень сложно получилось(

    UPD
    Думаю, для arduino наверняка существуют фреймворки, помогающие писать в стиле, что я описал. Ну и описанная модель не единственная.
    Я начал писать собственный фреймворк для кооперативной мультизадачности (наверняка велосипед, но не суть). Я с радостью поделюсь им, он есть на гитхабе, но я пока не готов назвать его законченным.
     
  14. Securbond

    Securbond Гуру

    Это всё делает библиотека и функция, которая будет прописана в файле .cpp Просто хотелось выделить всю эту кучку кода в отдельный класс, что бы разгрузить основной файл .ino и использовать этот класс в других проектах.
     
  15. railmisaka

    railmisaka Гик

    Тогда остается первая половина моего ответа, про функции.
    Но если основную работу делает сторонний код, возможно вам нужен не класс, а функция, или вообще ничего не нужно. Это если мы говорим о "правильной" структуре кода.
     
  16. Securbond

    Securbond Гуру

    У меня и так всё работает через функцию, но хотелось разобраться с классами на конкретной задаче. Иначе зачем трудился ТС.
     
  17. railmisaka

    railmisaka Гик

    Просто не надо думать, что если классы существуют, они нужны везде.
     
  18. DetSimen

    DetSimen Guest

  19. railmisaka

    railmisaka Гик

    У меня есть свое, но почитаю)
     
  20. DIYMan

    DIYMan Guest

    Плохое объявление, негодное - String передаётся по значению, лишний расход оперативки. Надо так:
    Код (C++):
    MatrixTxt(byte apin, const String& amtext);
     
    Securbond нравится это.