Ответы пользователя по тегу C++
  • Почему при компиляции проекта console application в dev c++ большой вес файла?

    @res2001
    Developer, ex-admin
    Используйте динамическую (а не статическую) линковку со стандартной библиотекой, возможно это уменьшит размер исполняемого файла. Но в этом случае клиенту придется тащить дополнительные библиотеки в виде отдельных файлов *.dll или в случае MSVC устанавливать runtime правильной версии.
    Ответ написан
    Комментировать
  • Почему некорректно находит произведение чисел?

    @res2001
    Developer, ex-admin
    Почему вы в функции с переменным количеством аргументов не используете стандартный механизм для работы с аргументами в подобных функциях (#include <cstdarg>)?

    Поставьте отладочный вывод в цикл, где выведите значение count, а заодно и *ptr и comp. То же самое можно быстро посмотреть в отладчике затратив минуты 3 на все. Выводите значение floatов с большим количество знаков после запятой (10-15).
    Вы будете удивлены тому, что во float 3.0 это не обязательно равно 3, ну и т.д. То же самое относится к любым типам с плавающей точкой.
    Передавайте первым аргументом uint32_t, вторым и следующим float. Тогда все будет нормально. Код, конечно, придется немного переделать.
    Ответ написан
    3 комментария
  • Как проверить переменную любого ссылочного типа на null?

    @res2001
    Developer, ex-admin
    По стандарту ссылка не может указывать на несуществующий объект (NULL), поэтому, если вы сделаете так:
    if (&refTypeParam == null)
    Компилятор запросто может выкинуть этот код в процессе оптимизации, т.к. условие по стандарту никогда не выполнится.
    Вещи типа этой:
    int &v = *(int*)NULL;
    это неопределенное поведение по стандарту. Но на сколько я знаю, такое вполне прокатывает.
    https://stackoverflow.com/questions/4364536/is-nul...
    Ответ написан
    1 комментарий
  • Как правильно организовать прием данных через WS?

    @res2001
    Developer, ex-admin
    или я что то не так понял

    Именно.
    Вы выбрали асинихронный инструмент, не понимая как он работает.
    ioc.run() - запускает цикл обработки асинхроных событий (event loop). Когда он завершается, то вы не сможете уже что-либо получать/передавать.
    Ваша задача добавить нужный вам код в обработчики событий (функции on_xxx()). Как это правильно делать смотрите документацию по библиотеке и возможно другие примеры использования.

    Я никогда не использовал boost.beast и WebSocket, но некоторый опыт асинхронного программирования есть, а принципы асинхронного программирования в любых библиотеках одни и те же.
    Ответ написан
    Комментировать
  • Многострочный литерал C++ u8"один"sv u8"два"sv: что можно убрать?

    @res2001
    Developer, ex-admin
    u8 говорит о том, что строка в кавычках будет в кодировке UTF8: https://en.cppreference.com/w/cpp/language/string_...
    sv - преобразует строку в string_view: https://en.cppreference.com/w/cpp/string/basic_str...
    А нужно оно или нет - решать вам, в зависимости от контекста.
    Ответ написан
  • Как оптимизировать мой код?

    @res2001
    Developer, ex-admin
    В свое время оптимизировал нечто похожее на Windows API. Там просто выводил все в контекст в памяти, а затем копировал этот контекст в контекст устройства вывода (окно). Думаю что-то подобное можно соорудить и в SFML.
    Так же может поможет другой подход - отключение отрисовки и включение ее после того как все будет нарисовано.
    С SFML никогда дела не имел, просто это достаточно общие подходы, на мой взгляд.
    Ответ написан
    Комментировать
  • Какие есть способы реализации системы внешних скриптов?

    @res2001
    Developer, ex-admin
    Питон так же используется для подобной схемы. Например в Танках, если не ошибаюсь, его используют.
    В браузерах и node.js используется JS - схема аналогичная.
    В Far manager - Lua.
    Ответ написан
    Комментировать
  • Проблема с двусвязным списком?

    @res2001
    Developer, ex-admin
    В del_node() происходит освобождение памяти, а затем в result вы обращаетесь к освобожденной памяти (второй цикл):
    p = p->next;
    Зачем в result первый цикл? И зачем в программе z?
    Ответ написан
    Комментировать
  • Какие книги по C++ актуальны на 21 год для обучения с нуля?

    @res2001
    Developer, ex-admin
    Для начала берите любую книгу для начинающих. Лафоре подойдет. Берите издание по свежее. Есть и другие книги подобного рода, конечно.
    Страуструп тяжел и не годится для старта.
    Саттер, Мейерс больше для продвинутых.
    C++ Templates для старта точно не нужен.
    Так же не плохо было бы начать что-то читать по алгоритмам.

    Сейчас проблема с изучением С++ в том, что с 2011 года начали регулярно появляться новые стандарты, в них появляются фишки, которых раньше не было, некоторые из них очень полезные. Толстые учебники не успевают переписываться под актуальные стандарты. Но это не большая беда.
    Базовым сейчас является стандарт С++11 (или С++14 - это дополнение к С++11), его применяют уже многие. Более поздние (17, 20) применяются реже, так что можно не гнаться за тем, чтобы в книге они были освещены. Базовые понятия в С++ в целом мало изменились с древних времен. Но кое-что добавилось.
    Кстати, проблема с поддержкой новых стандартов актуальна не только для книг, но и для компиляторов языка.
    После освоения базы и начала практической деятельности сможете дальше продвигаться в изучении языка, ориентируясь на свои реальные потребности.
    Главное в изучении - больше практики - не зацикливайтесь на книгах. В начале старайтесь делать задания из книг. Когда более-менее освоитесь, переходите к своим задачам/интересам.
    Ответ написан
    1 комментарий
  • Как из аналогового сигнала получить вольты?

    @res2001
    Developer, ex-admin
    Не знаю как там в ардуинах, но ...
    Думаю, что аналоговый сигнал подается на АЦП и в программе вы имеете дело уже с дискретным (оцифрованным) сигналом.
    Так вот, в АЦП, обычно существует пара коэффициентов (смещение нуля и масштаб), в документации к АЦП приводится формула как использовать эти коэффициенты с цифровым отсчетом сигнала, что бы получить вольты (кстати, АЦП не обязательно меряет именно напряжение). Обычно формула это что-то вроде: (X + offset)*scale. Но могут быть и другие варианты.
    Коэффициенты на всех АЦП разные. Даже на двух одинаковых АЦП они могут быть разные (и как правило они разные). АЦП калибруются на заводе и коэффициенты зашиваются в чип. В документации к АЦП должен быть описан способ получения этих коэффициентов. Если АЦП многоканальное, то коэффициенты могут быть разными для каждого канала.
    В библиотеке работы с АЦП, обычно присутствуют функции получения калибровочных коэффициентов и может быть даже получение уже преобразованного сигнала.

    Вообще если бы АЦП было идеальным, то преобразовать цифровой отсчет в вольты было бы просто. Например АЦП выдает 16 битные без знаковые отсчеты (т.е. на выходе АЦП числа от 0 до 65535, тип данных uint16_t), диапазон измерений допустим [-5; +5]В. Пусть uint16_t Х - цифровой отсчет, полученный от АЦП, тогда преобразовать его в вольты можно так: ((double)(((int32_t)X) - 0x7FFF)) / 0x7FFF ) * 5.0. При желании можно раскрыть скобки и получить те самые 2 калибровочных коэффициента для идеального АЦП.
    Но т.к. АЦП не идеальны и там присутствуют разнообразные погрешности и помехи, то и появляются те самые калибровочные коэффициенты. Формула преобразования остается примерно той же самой, но используются уже не точные числа, а подобранные коэффициенты.
    Ответ написан
    2 комментария
  • Какую версию стандарта учить/использовать в 2021 году?

    @res2001
    Developer, ex-admin
    Используют ту версию, которая принята в проекте. Обычно, в проекте уже приняты определенные правила, в т.ч. и по используемому компилятору, версии языка и т.п. Ты просто принимаешь эти правила и работаешь в проекте (или не принимаешь и не работаешь).
    Сейчас все используют минимум C++14. C++14 - это небольшой апгрейд над C++11, все значимые изменения были в C++11, так что литература по С++11 вполне подходит.
    Самые "продвинутые" используют С++17 и может быть кто-то уже и С++20.
    Хватает и старых проектов, где большая кодовая база, написана на старых стандартах языка до С++11.

    На самом деле основы языка изменяются мало. Вся ООП обвязка вполне актуальна со времен С++03, кое что добавили, но и старое то же работает.
    Ответ написан
    1 комментарий
  • Что означает void book::buybook()?

    @res2001
    Developer, ex-admin
    У функции объявленной как:
    void func(...);
    нет возвращаемого значения.
    То что функция в данном примере это метод класса значения не имеет.
    Ответ написан
    Комментировать
  • Есть ли какая нибудь функция из встроенных библиотек в с++ для проверки является ли строка числом?

    @res2001
    Developer, ex-admin
    Сконвертируйте строку в число с помощью strtod() (или любой функции из этой серии) и проанализируйте возвращаемое значение и значение второго параметра. По этой информации можно сделать любые нужные выводы.

    Еще есть isdigit() - но она проверяет символ только на цифры, а число может быть разным - например начинаться со знака или если дробное, то в нем будет разделитель дробной части, который может быть первым. Но в простых случаях ее может быть достаточно.
    Ответ написан
    Комментировать
  • Как правильно построить структуру проекта используя cmake?

    @res2001
    Developer, ex-admin
    Отлаживать библиотеку логичнее специально написанными для этого тестами. В этом случае библиотека будет представлять самостоятельный продукт. Ее можно будет устанавливать клиентам отдельно. А в основном продукте использовать find_package для поиска библиотеки.

    Если вам этого не надо, то вполне нормально включать каталог с исходниками библиотеки как подкаталог продукта и использовать add_subdirectory.
    Ответ написан
    Комментировать
  • Одномерные массивы C++ почему не вычисляет произведение отрицательных элементов массива М и максимальный элемент массива К?

    @res2001
    Developer, ex-admin
    С произведением все просто - вы инициализировали Dob_v нулем, а произведение любого числа с нулем = нулю. Вот у вас всегда нулевой результат. Инициализируйте Dob_v единицей.
    У вас путаница в двух последних циклах - разберитесь с закрывающими скобками - получается цикл по K вложен в цикл по M. Причем в цикле по К не правильное условие, т.к. К содержит всего 10 элементов.
    Ответ написан
    Комментировать
  • Где ошибка.....?

    @res2001
    Developer, ex-admin
    Функцию count реализуйте макросом:
    #define count(arr)     (sizeof(arr) / sizeof(arr[0])

    Внутри функции вы не можете получить размер статического массива, объявленного в другой функции.
    Ответ написан
    Комментировать
  • C++ WinForm Как правильно вывести массив структур переданный через указатель?

    @res2001
    Developer, ex-admin
    base[ind].birth.month
    Вообще и остальные поля нужно выводить через точку.
    Кроме того, если приведенный код ch_kol() - это реально все что есть в функции, то это не верно. Вы в ch_kol возвращаете указатель на локальную переменную, как только отработает return этот указатель станет не действиетльным, т.к. массив base перестанет существовать после выхода из функции.
    Подобное определение массива baseProgr base[max];, если max не константа приводит к объявлению массива переменной длины (VLA). Строго говоря С++ не поддерживает VLA, т.к. это фишка Си. Но некоторые компиляторы (gcc) при включенных расширениях (по умолчанию включено) позволяют их использовать. Но этот код становится не переносимым, т.к. при других опциях компилятора или на другом компиляторе код может не собраться.
    Ответ написан
    4 комментария
  • Как правильно настроить кодировку для std::ifstream и std::string?

    @res2001
    Developer, ex-admin
    Используйте wstring и широкие символы вместо string и char.
    Ответ написан
    2 комментария
  • Как вызвать класс комплексное число?

    @res2001
    Developer, ex-admin
    Для получения 9+12i надо вызвать computePolynomial(), его результат вывести на экран.
    Ответ написан
  • Как создать проект с++ на основе готового кода?

    @res2001
    Developer, ex-admin
    5000 ошибок - скорее всего вы что-то делаете не так.
    Обычно к проектам прилагается хотя бы минимальная инструкция по сборке, где, обычно пишут, какой компилятор и среду использовать для сборки.
    Даже под винду далеко не все проекты используют MS Visual Studio, поэтому sln файлы совсем не обязательный аттрибут.
    Для кросс платформенных проектов, обычно используют какие-то универсильные средства для сборки, например cmake (есть еще ряд других), у которых свои правила использования.
    Все это кажется сложным, но на самом деле это не сильно сложно, можно достаточно легко "набить руку" собирая разные проекты скажем в течение месяца :-) Так что ваши 50 часов - ни о чем.
    Ответ написан
    Комментировать