Ответы пользователя по тегу C++
  • Как оптимизировать мой код?

    @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 часов - ни о чем.
    Ответ написан
    Комментировать
  • Инкремент и декремент?

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

    Префиксный вариант проще в реализации, а значит работает чуть быстрее. При большом количестве итераций в цикле это может иметь некоторое значение. В префиксном варианте нет "отложенных эффектов", из-за которых в постфиксном варианте могут возникать ошибки.
    Ответ написан
    Комментировать
  • Безопасно использовать типы atomic из Си в динамических структурах?

    @res2001
    Developer, ex-admin
    Атомарные переменные - это такие же переменные как и остальные. Инициализировать их вы можете сколько угодно раз. Это относится только к встроенным типам. Атомарные классы - это сказка.
    Но на них накладываются некоторые ограничения:
    1. выравнивание переменной - переменная должна находится по адресу обычно кратному размеру переменной. Если не будет правильного выравнивания, то intelовские процы могут сделать 2 операции чтения, что уже не будет атомарной операцией. Другие процы могут сгенерировать какое-нибудь исключение.
    2. атомарная переменная всегда volatile - т.е. компилятор не может ее кэшировать в регистре, всегда идет обращение к памяти.
    Не все атомарные переменные в std действительно атомарны. Это проверяется с помощью atomic_is_lock_free(). Атомарность зависит от платформы. Например на x86 int64 - не атомарна из-за ограничений процессора. Тогда как на 32 битных АРМах она вполне атомарна.
    При обычном чтении/записи атомарных переменных (с упорядочиванием памяти memory_order_seq_cst) происходит синхронизация кэшей ядер - из-за чего атомарные операции "дороже" не атомарных. Но этот процесс на разных архитектурах стоит по разному. Для синхронизации кэшей есть отдельные ассемблерные инструкции.

    В целом все undefined behavior для атомарных переменных в std связаны с:
    1. возможностью объявить атомарным любой класс
    2. не для всех встроенных типов на конкретной платформе гарантируется реальная атомарность (atomic_is_lock_free).
    3. если вы не будете соблюдать ограничения, то же ничего гарантировать нельзя.
    Так что особо пугаться undefined behavior не стоит. Просто соблюдайте ограничения, не используйте атомарные классы и удостоверьтесь, что встроенные типы на вашей платформе действительно атомарны.
    Ответ написан
    1 комментарий
  • Вывести вместо пробелов введенной строки его ASCII-код?

    @res2001
    Developer, ex-admin
    Просто преобразуйте символ в int и выводите.
    char a = ' ';
    std::cout << "ASCII code: " << static_cast<int>(a) << std::endl;
    Ответ написан
    1 комментарий
  • Как комбинировать несколько значений из одного enum?

    @res2001
    Developer, ex-admin
    Битовые операции можно использовать только если ваш enum состоит из значений равных степеням двойки: 1, 2, 4, 8, ...
    Если у вас произвольные значения в enum (1, 2, 3, 105, 888, ...) то битовые операции применять нельзя.
    Если нужен какой-то универсальный вариант - сделайте массив значений.
    Ответ написан
    Комментировать
  • Как можно оптимизировать код?

    @res2001
    Developer, ex-admin
    Может быть, если конвертировать число в строку и проверять строку на палиндром, будет быстрее. Не уверен, надо проверять. Только не используйте std::string, а используйте стандартный сишный массив символов.
    Ответ написан
    Комментировать