Ответы пользователя по тегу C++
  • Как сделать constexpr strtol?

    @dima20155
    you don't choose c++. It chooses you
    Вроде, нет никакой сложности сделать compile-time strtol
    https://godbolt.org/z/z1o7f63K1
    Ответ написан
    8 комментариев
  • Как объединить цифры жк экрана с драйвером ht1621b?

    @dima20155
    you don't choose c++. It chooses you
    Для объединения двух цифр в одну вам нужно просто в своей функции принимать число не больше 99, разбивать на цифры и выводить на соответствующие экраны.
    примерно так:
    void numberToHT1621(int number) {
        if (number > 99) {
            number &= 0xffff;
        }
        int first_digit = number % 10;
        int second_digit = number / 10;
        
        // printf("%d %d", second_digit, first_digit);  // for debug
        
        // write number on display
        Write_1621(27, first_digit);
        Write_1621(29, second_digit);
    }


    Для таймера же я бы предложил вам реализовать функцию (а может даже класс?), которая каждые N тиков таймера микроконтроллера (или же при каждом прерывании аппаратного таймера, если они у вас настроены) будет отображать на дисплее новое число.

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

    Среда Ардуино поддерживает аппаратные таймеры, но можно и просто в функции loop постоянно вызывать updateTimer.

    class CountdownTimer {
    public:
        CountdownTimer(int timeInMCUTicks) : time(timeInMCUTicks) { }
        void updateTimer(int ticks = 1) {
            if (time <= 0) {
                time = 0;
                numberToHT1621(time);
                return;
            }
    
            numberToHT1621(time);
            time -= ticks;
        }
    private:
        int time;
    };
    Ответ написан
    Комментировать
  • Как преобразовать char* содержащий символы unicode?

    @dima20155
    you don't choose c++. It chooses you
    Если я правильно понял чего выхотите добиться, то можете попробовать данную библиотеку https://github.com/nemtrif/utfcpp
    Крайне простая и компактная
    Ответ написан
    1 комментарий
  • Как правильно реализовать освобождение памяти выделенной в функции?

    @dima20155
    you don't choose c++. It chooses you
    Все до безобразия просто:
    Вы выделяете память в момент, когда она вам нужна, а удаляете когда эта память вам более не нужна.
    Соотвественно, вам нужна функция array_deinit(), которая возьмет на себя непосильную ношу освобождения памяти в момент, когда вы больше не планируете обращаться к своему двумерному массиву.

    В простейшем случае, в С++ подобный функционал оборачивают в класс, который, в свою очередь, обязательно должен почистить за собой память хотя бы в деструкторе.

    Также в современном С++ не принято использовать new/delete без веской причины (например, вы пишете супер быстрый, современный контейнер, в котором хотите управлять всеми аллокациями самостоятельно), а рекомендуется использовать умные указатели для работы с памятью.
    Ответ написан
    2 комментария
  • Почему нельзя использовать std::function как аргумет шаблонной функции?

    @dima20155
    you don't choose c++. It chooses you
    Потому что lambda != std::functional
    Пример:
    https://godbolt.org/z/YrKc8q5q7

    https://stackoverflow.com/questions/11774277/lambd....
    Ответ написан
    Комментировать
  • Не работает case в switch. Как решить проблему?

    @dima20155
    you don't choose c++. It chooses you
    У вас не хватает break в конце блока case
    Вот пример:
    https://en.cppreference.com/w/cpp/language/switch
    Ответ написан
    Комментировать
  • Как конвертировать изображение в матрицу?

    @dima20155
    you don't choose c++. It chooses you
    Если я правильно понял вы хотите конвертировать jpg в матрицу пикселей.
    Самый простой способ конвертировать jpg в матрицу пикселей:
    https://stackoverflow.com/questions/26230911/openc...
    С cv::Mat можно работать как с матрицей

    Для самописного решения нужно будет потратить весьма не мало времени, чтобы декодировать jpg
    Ответ написан
    Комментировать
  • В чем преимущества использования С++ в embedded?

    @dima20155
    you don't choose c++. It chooses you
    БПЛА, автопилоты сильно сложнее с алгоритмической точки зрения, чем отправить N байт по UART или переложить их в X регистр. Поэтому ответ тут такой же как и на вопрос: Почему для написания современных приложений зачастую используется С++, а не С.
    Опять же, не стоит обобщать: довольно немалое количество компаний пишет свои автопилоты на чистом С из-за сертификации, каких-либо бюрократических требований.
    Ответ написан
    3 комментария
  • Почему в С++ не работают 2 цикла for?

    @dima20155
    you don't choose c++. It chooses you
    У вас в конце первого цикла i = n, соответственно, второй цикл просто не выполнит ни одной итерации, так как условие остановки цикла сразу же истинно
    Ответ написан
    Комментировать
  • Как отобразить байт в двоичном виде?

    @dima20155
    you don't choose c++. It chooses you
    Вывести все, что пришло через последовательный порт:

    for (auto it = res.constBegin(); it != res.constEnd(); ++it) {
        std::cout << bitset<8>(*it).to_string() << std::endl;
    }


    Скорее всего, должен также сработать STL-style code (судя по документации):

    for (const auto it: res) {
        std::cout << bitset<8>(*it).to_string() << std::endl;
    }
    Ответ написан
    Комментировать
  • Почему заведомо неверно if?

    @dima20155
    you don't choose c++. It chooses you
    Потому что символы # перед if else не нужны. При такой записи эти инструкции будут рассматриваться как директивы препроцессора, которые тебе здесь не нужны. В вашем коде происходит проверка дефайнов (#define) предпроцессора. Поскольку вы не объявили что-то вроде:
    #define number 2
    то препроцессор отдает на компиляцию следующий код:
    int number, wrong;
    printf("Введите номер (1-5):\n");
    scanf("%d", &number);
    printf("Вы ввели неправильное число");
    printf("\n%d", wrong);
    return 0;


    То есть в момент исполнения программы просто нет никакого if. В общем, подтяните знание языка
    Вам нужно что-то такое:

    int main() {
        int number, wrong;
        printf("Введите номер (1-5):\n");
        scanf("%d", &number);
        if (number>1 && number<5) {
            printf("Вы ввели правильное число: %d", number);
        } else {
            printf("Вы ввели неправильное число: %d", number);
        }
        return 0;
    }
    Ответ написан
    1 комментарий
  • Как исправить данную оишбку?

    @dima20155
    you don't choose c++. It chooses you
    Проблема в операторе []
    А именно в условии
    while (current->next != NULL)
    Должно быть
    while (current != NULL)

    Также у вас данный оператор не возвращает ничего в случае, индекс больше, чем количество элементов в листе, а также не проверяет условие по типу:
    index < size

    Помимо этого у вас ещё много проблем в коде, но если вы начинающий, то что же, учитесь, все впереди. Попробуйти найти себе человека, который сможет скорректировать/отревьюить ваш код, потому в текущем виде он весьма плохо может работать, из-за сырых указателей, таких же сырых выделений памяти, отсутствия её освобождения, непонятно зачем наличие оператора [] у linked list (в стандартной библиотеки их нет не случайно и нужна веская причина чтобы пользоваться оператором [] в linked list )
    Ответ написан
    1 комментарий
  • С++; Дескоптные приложения или веб или операционные приложения?

    @dima20155
    you don't choose c++. It chooses you
    На С++ вы можете реализовать весьма и весьма многое.
    Например, различные графических приложений с использованием SDL, SFML, raylib, QT, imgui и др. (и это лишь самое известные библиотеки/фрейворки).
    Для веба есть oatpp, crow, fastcgi. (довольно большое число сайтов использует nginx, который написан даже не на С++, а на С.)
    Работа с видео: ffmpeg, gstreamer, opencv.

    Если есть желание разобраться с ОС и драйверами, то тут вам дорога в API самих ОС (основа которых тоже зачастую на С писалась). Зачастую драйвера пишут на С/С++ (как и прошивки для различных IoT устройств, которые иногда и нуждаются в драйверах).
    Ответ написан
    Комментировать
  • Устарел ли учебник Стивена Прата по C++?

    @dima20155
    you don't choose c++. It chooses you
    Зависит от ваших целей и вашего уровня. Если ваша цель писать на С++ определенного стандарта, то почему бы и нет. Если вы просто хотите писать на современном С++, то выбирайте учебник, который написан с учетом современных стандартов, ибо с каждым стандартом добавляются дополнительный функционал, который сильно упрощает жизнь.

    Также никто вам не запрещает выучить базовый синтаксис по относительно старому учебнику (базовый синтаксис никто не отменял), а дальше перейти на что-то современное.
    Ответ написан
    Комментировать
  • Как в Cmake папку с срр добавить целиком?

    @dima20155
    you don't choose c++. It chooses you
    Насколько знаю, добавляют cpp руками.
    Вот пример (почти три сотни исходников) https://github.com/oatpp/oatpp/blob/master/src/CMa...
    При правильном подходе вы делаете это лишь 1 раз, так что никакой проблемы это представлять не должно.
    Ответ написан
    Комментировать
  • Почему адреса переменных в памяти стоят в обратном порядке от объявления?

    @dima20155
    you don't choose c++. It chooses you
    С исторических времён повелось, что стек растет в этом направлении. При проектировании основными целями были оптимизация и экономия. Стек растет сверху вниз, а куча в в обратном направлении.
    Ответ написан
    7 комментариев
  • Как оформить код?

    @dima20155
    you don't choose c++. It chooses you
    самое простое - используйте typedef или using
    А также можно написать свой класс-обертку для удобства.
    Ответ написан
    3 комментария
  • Сложно ли создать тг бота на c++?

    @dima20155
    you don't choose c++. It chooses you
    Отличается все прежде всего тем, что написание такого бота потребует чуть больше усилий в отличии от классического бота на python как минимум из-за меньшей популярности С++ в данной сфере. Судя по официальному сайту есть несколько библиотек для С++ для работы с телеграм API (https://core.telegram.org/bots/samples). Хотя вы всегда можете отправлять HTTP запросы напрямую с помощью какой-нибудь либы или совсем без неё.

    Но если вы ищите прежде всего видео о том как написать/воспользоваться той или иной либой на С++, то спешу вас огорчить: все что находится за пределами stl/boost/qt/sfml/sdl и ещё некоторого количества либ/фреймворков требует от вас чтение документации и, иногда, исходников.

    Сама программа (и её разработка) в случае С++ будет отличаться лишь, возможно, большей сложностью.
    Самая первая задачка, с которой вы столкнетесь - это собрать библиотеку и все зависимости. Одна из готовых библиотек использует следующий набор зависимостей:

    CMake
    Boost
    OpenSSL
    ZLib
    Libcurl (optional unless you want to use curl-based http client CurlHttpClient).

    И каждая библиотека за собой может тянуть ещё зависимости.
    Вот, например, installation notes для OpenSSL
    Это не всегда сложно, особенно для популярных библиотек, но требует время, а иногда и настройку/допиливание под свой тулчейн.
    Ответ написан
    Комментировать
  • Как сделать ползунок SFML?

    @dima20155
    you don't choose c++. It chooses you
    Идейно слайдер и есть кнопка с двумя триггерами - кнопка была нажата, отпущена.
    Между нажатием и отпусканием кнопки вы отслеживание положение мышки и заполняете шкалу/перемещаете слайдер.
    Вот пример, который можно взять за основу. Есть и другие. Также легко найти на гитхаб.
    https://github.com/abodelot/sfml-widgets
    Ответ написан
    Комментировать
  • Происходит ли нарушение инкапсуляции, если реализация хранится в .h-файлах?

    @dima20155
    you don't choose c++. It chooses you
    Нарушением инкапсуляции это довольно сложно назвать, ибо приватные функции все ещё остаются приватными с точки зрения других классов. Сокрываете вы реализацию методов класса от других сущностей в вашем коде, а не от программиста (если я правильно понял причину по которой вы решили, что это нарушение инкапсуляции).
    Мне нравится метод организации данного кода следущим образом:

    Foo.h
    template <typename T>
    struct Foo
    {
        void doSomething(T param);
    };
    
    #include "Foo_impl.h"


    Foo_impl.h
    template <typename T>
    void Foo<T>::doSomething(T param)
    {
        //implementation
    }


    Код украл отсюда
    https://stackoverflow.com/questions/495021/why-can...
    Ответ написан
    1 комментарий