Ответы пользователя по тегу C++
  • Как работает заполнение одномерного массива по типу двумерного, если данные по идеи никак не меняются(добавляются или изменяются)?

    @dima20155
    you don't choose c++. It chooses you
    Вам стоит почитать об указателях.
    Размер массива очень даже важен.
    Вы создаёте массив, а затем пишите данные по указателю на массив с некоторым смещением. Фактически ничто не мешает вам писать что угодно и куда удобно (в пределах памяти, доступной вашей программе) и ничего вам за это не будет. В данном случае вы нагло пишите данные по указателю (который указывает на данные в области .data). данная область памяти значительно больше 1 байта и все, что вы туда записали будет храниться в ней. Проблема заключается в том, что массив имеет длину лишь 1 байт, а значит вы пишите в память, которая не принадлежит данной переменной/массиву, а принадлежит какой-то другой переменной и тем самым изменяете значение этой переменной.

    Заведите вторую переменную, скажем, mas2 чуть большего размера (главная, чтобы линковщик положил ее после mas.) И заполните ее каким-то полезными данными, а затем выполните свой код заполнения двумерного массива и распечатайте оба массива.

    Также можете попробовать создать массив в динамической памяти размером 1 байт, а потом заполнить своим кодом двумерный массив размера так 100х100 и получить классический SEGFAULT от операционной системы.

    К сожалению, уместить в 1 байт целый массив нельзя, а может оно и к лучшему.
    Ответ написан
  • Как исправить ошибку LNK2001 unresolved external symbol __imp_GetUserNameW C++?

    @dima20155
    you don't choose c++. It chooses you
    Вы настроили Linker перед компилияцией?
    Вероятно, самым простым способом будет выбрать другой тип проекта (desktop под windows)
    Или же настройте Linker самостоятельно (.lib + точка входа + тип приложения)
    Ответ написан
    1 комментарий
  • Как в c++ записать принадлежность х к множеству целых чисел?

    @dima20155
    you don't choose c++. It chooses you
    Всегда можно написать две перегруженные функции, первая принимает, например, int, а вторая char. Или же написать шаблонную функцию с ветвлением с std::is_same
    Ответ написан
    Комментировать
  • Как принять число любой длины?

    @dima20155
    you don't choose c++. It chooses you
    Используйте, например,
    vector<char> // или
    std::string
    Ответ написан
    Комментировать
  • MSVCP140.dll, что делать sfml?

    @dima20155
    you don't choose c++. It chooses you
    dll - Dynamic Link Library.
    либо вместе с exe файлом нужно также скачивать на другой компьютер нужные dll файлы (или, например, запаковать все в msi installer), либо использовать статическую линковку, чтобы не было этой зависимости.
    Ответ написан
  • С++ На всех ли платформах одинаковая точность операций с float?

    @dima20155
    you don't choose c++. It chooses you
    Если вы пишите кросплатформенное ПО, то используйте платформонезависимые типы:
    int32_t, uint16_t, float32_t и так далее (также есть чуть более хитрый unsigned тип std::size_t).

    Это классический подход, которые используется много где. Даже если вы пишите ПО для 2-ух или 3-ех известных вам платформ, то будет хорошей практикой использовать подобные типы.
    https://en.cppreference.com/w/cpp/header/stdfloat

    float занимает 4 байта, double - 8 байт и на 32битной платформе и на 64битной:
    Ответ написан
    1 комментарий
  • Уменьшается ли используемая память программы?

    @dima20155
    you don't choose c++. It chooses you
    Сама переменная в фигурных скобках бесполезно.
    А если вы проводить какие-то манипуляции с переменными в отдельной области видимости, то это и есть то, что делают функции. Да, действительно, если все функции напрямую вставить в поле main и получить спагетти код, то помимо того, что у вас потребуется значительно больше памяти на стеке, так ещё вы будете хранить кучу ненужных переменных. К слову, стек имеет размер около 1МБ, что как вы догадыветесь только в контексте микроконтроллеров много.
    Ответ написан
    Комментировать
  • В Visual Studio можно ли поменять стандарт c++ по умолчанию?

    @dima20155
    you don't choose c++. It chooses you
    Комментировать
  • Чем заменить SFML?

    @dima20155
    you don't choose c++. It chooses you
    SFML можно установить для Visual Studio, но если вам не нравится сама идея того, что библиотека заброшена (хотя на github есть активность и готовится к публикации версия 2.6), то посмотрите в сторону SDL2. Вообще SFML довольно популярна, поэтому уверен, что вы сможете найти подробное описание танцев, для которых даже бубен не понадобится + всегда можно собрать из исходников либу.
    Ответ написан
    3 комментария
  • В чём отличия языка Си и С++? Зачем нужен Си?

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

    Для встраиваемых систем у вас может возникнуть желание реализовать контейнеры самостоятельно, а тогда встаёт вопрос а зачем вам вообще заморачиваться с добавлением поддержки плюсов в свой проект.

    Ещё одной важной причиной может являться проблема с сертификацией: в МРТ аппарате или рентгеновской трубке требования к надёжности должны быть довольно серьезными, а, следовательно, необходимо доказать, что программный пакет (например, новую стандартную библиотеку из С++23) безопасно использовать в данной сфере.

    Динамические массивы удобнее писать на С? А если вам нужно хранить в массиве что-то сложнее int? Все равно будет также легко, как на плюсах? Сомневаюсь.
    Ответ написан
  • Использование шаблона в многофайловом проекте, как реализовано в vector например?

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

    Foo.h

    template <typename T>
    struct MyStruct
    {
        void foo(T arg);
    };
    
    #include "Foo-inl.h"


    Foo-inl.h
    template <typename T>
    void MyStruct<T>::foo(T arg)
    {
        // some code
    }


    Также, если вы используете специализируете шаблонный параметр в определении методов класса методов, то такие методы можно поместить в .cpp файл.
    Ответ написан
    Комментировать
  • Что быстрее: создание вектора push_back или сначала объявление сколько в нем переменных, а потом заполнение?

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

    При небольшом размере вектора (0-10 элементов) и большом количестве элементов, которые необходимо вставить в вектор (напр., 500) разница более значительна, потому что алгоритм оптимизации push_back выполнит несколько аллокаций за это время. На больших же значениях (напр., размер вектора 3 элемента, а необходимо вставить 100000) разница приближается к единицам процентов (судя по моим тестам ~2-5%)
    https://godbolt.org/z/9ThqYjP4o
    Ответ написан
    Комментировать
  • Что можете сказать про данный код?

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

    2. Вы принимаете аргументы в функции по значению, что плохо в данном случае. Классика - принимать ко константной ссылке.

    3. Имя лист для вектора неудачное, лучше array или strArray в вашем конкретном случае.

    4. Функция NUM бесполезна, так как является обёрткой над понятной шаблонной функцией std::to_string. В вашем случае не ясно что делает функция при прочтении ее имени

    5. Вы уверены, что код типа output({ input() }); вам необходим? Вы здесь выполняете слишком много лишних операций. Хотя по факту это должна быть просто одна строка std::cout
    Ответ написан
    2 комментария
  • CMake в Visual Studio отказывается билдить проект?

    @dima20155
    you don't choose c++. It chooses you
    Тык у вас же написано в предпоследней строчке:
    Не удается найти ресурсный файл студии.
    Уберите зависимость от него в файле проекта или восстановите этот файл.
    Ответ написан
  • Как сделать перегрузку "=="?

    @dima20155
    you don't choose c++. It chooses you
    Замените строку
    if (planets[i].name == name_d)
    на
    if (planets[i] == name_d)
    Если хотите, чтобы вызывался operator==
    Но у вас там кроме этого ещё очень много странностей.
    Зачем сравниваете строки напрямую? Есть strcmp
    Зачем вообще работаете с сырыми строками, если даже не следите за очисткой памяти?
    Лучше замените все на std::string.
    Ответ написан
    Комментировать
  • Как быстро округлить timestamp до секунд, минут, часов, дней и т.д.?

    @dima20155
    you don't choose c++. It chooses you
    Можете использовать duration_cast до дней.В доке как раз написано, что выполняется округление.Затем обратно преобразовать в time_point, если это необходимо.
    Ответ написан
    6 комментариев
  • В конце сборки telegram-bot-api под Ubuntu 20.04 выскочило предупреждение (см. описание), но сервер поднимается - надо ли пересобирать?

    @dima20155
    you don't choose c++. It chooses you
    Насколько я понимаю тут речь о том, что не нужно возвращать std::move(error), поскольку это локальный объект и компилятор сам использует либо RVO (return value optimization), а в случае невозможности RVO будет применено std::move неявно, поэтому следует убрать std::move, чтобы компилятор сам все сделал. Данная ошибка влияет лишь немного на производительность.
    Ответ написан
    4 комментария
  • Можно ли при вызове функции указать в него тип данных?

    @dima20155
    you don't choose c++. It chooses you
    Полагаю, что вам удобно будет использовать здесь шаблоны, если я правильно понял вопрос.
    Например:
    template <typename T>
    auto search (std::string str) {
        // T - data type
        T res;
        // do something
        return res;
    }
    
    int main () {
        auto a = search<int>("a");
        auto b = search<std::string>("a");
    }
    Ответ написан
    5 комментариев
  • Как сделать какую-нибудь многозадачность на ардуино?

    @dima20155
    you don't choose c++. It chooses you
    В Ардуино всего одно физическое ядро, поэтому вычислять в параллель у вас не выйдет. Единственное решение - переложить часть задач на переферию. Например, если значения из датчика отправляются на АЦП, то можно настроить прерывания и забирать данные когда удобно. Классический delay тоже лучше реализовать через таймер, ибо стандартный delay просто заставляет процессор ждать, вместо вычислений/других полезных действий
    Ответ написан
    4 комментария
  • Какие навыки требуются Junior программисту микроконтроллеров?

    @dima20155
    you don't choose c++. It chooses you
    1. Прежде всего, нужно знание схемотехники, но в вашем случае этот этап можно вычеркнуть.
    2. Естественно, знание основ С и С++ (синтаксиса, базовых конструкций). Советую вам использовать в своих проектах С++, поскольку зачастую вы сможете писать в стиле С без каких-либо проблем, а при необходимости воспользоваться фичами/библиотеками для С++.
    3. Навыки hardware и software отладки. Здесь просто нужна практика с любимой IDE.
    4. Понимание указателей, типов памяти (статическая, динамическая, автоматическая, регистровая). Как память выделяяется и прочее.
    5. Знание базовых структур данных. Это немного скользкий пункт, поскольку С++ предоставляет хорошую (хотя и весьма минималистичную) стандартную библиотеку STL, в которой есть большинство из необходимых структур данных, но они используют довольно много дополнительной аллокации памяти, поэтому если пишете под что-то 8битное, то имейте это ввиду.
    6. Знание git на базовом уровне сейчас важно для джуна любой IT специализации.
    7. Неплохо бы иметь базовое представление о том как устроен микроконтроллер и его архитектура.
    8. Неплохо бы понимать RTOS (FreeRTOS - классика жанра), а главное зачем он нужен, а когда он не нужен или вреден.
    9. Лично мне всегда в работе пригождается python, но это всегда сторонние задачи/автоматизация.

    P.S. Нашел ещё вот такой RoadMap.
    P.S.S. Получилось довольно объемно. Но пункты 2-5 по сути можно объединить в один. Все это можно изучить написав парочку проектов для классической STM32 + HAL.
    P.S.S.S. Сам начинал как hardware разработчик. Путь embedded разработчика начального уровня не был сложным для меня и занял не очень много времени.
    Ответ написан
    Комментировать