Задать вопрос
  • Как оптимизировать мой код?

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

    @res2001
    Developer, ex-admin
    Проходите по списку и выводе все строки где дата равна указанной. Все.
    Зачем тут сортировка?

    В плане сортировки и учитывая, что тема Базы данных, то если смотреть на любую реляционную СУБД, то там сортировка данных достигается за счет создания индексов. Индексы это отдельные (от данных) сущности, т.е. физически порядок данных не меняется, но существует отдельный отсортированный список "указателей на данные".
    Справедливости ради стоит сказать, что в СУБД существуют и "кластерные индексы" - это такой индекс, который определяет физическую сортировку данных, т.е. данные физически располагаются в хранилище в порядке указанном в кластерном индексе. Но такой индекс может быть только один для одного набора данных (таблицы), а обычных индексов может быть сколько угодно.

    Исходя из вышеописанного вы можете создать индекс по дате поступления. Индекс может представлять собой отсортированный массив указателей на данные, двусвязный список указателей или бинарное дерево указателей или что-то еще. При этом сам список данных останется прежним.
    Самый простой вариант массив указателей. Сортировать его можно с помощью стандартного qsort(), поиск производить с помощью бинарного поиска bsearch(). При добавлении или удалении элемента в данные, придется либо полностью перестраивать индекс, либо вручную добавлять/удалять элемент из индекса. В любом случае это будет достаточно затратной операцией.
    В двусвязном списке и бинарном дереве со вставкой и удалением все проще и гораздо быстрее. В этом случае проще всего генерировать индекс сразу по мере добавления данных, тогда индекс будет строится вместе со списком данных. Но это соответственно скажется на скорости этих операций. Бинарное дерево лучше реализовывать сразу сбалансированное. Работа с подобными структурами сильно усложнит ваш проект и возможно не совсем вписывается в рамки курсового проекта. Это уже вам решать.
    Ответ написан
    Комментировать
  • Какие есть способы реализации системы внешних скриптов?

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

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

    @res2001
    Developer, ex-admin
    Переименуйте файл, сделайте attach, дайте другое имя базе.
    Ответ написан
  • Где здесь путаница?

    @res2001
    Developer, ex-admin
    Зачем это
    r[j] = '\0';
    в цикле? Вынесите из цикла.
    Путаницу в куче я вижу только в том смысле, что памяти выделяется больше, чем нужно. Можно этот момент подрихтовать.
    Сам цикл я бы реализовал немного по другому - так чтобы в одной итерации цикла добавлялись сразу 2 символа из строки и один symbol. В этом случае нужно будет еще обработать оставшийся хвост, если количество символов не четное.

    Добавлено: Проглядел отсутствие освобождения памяти. Оно необходимо, конечно.
    Ответ написан
  • С: Объясните, что не так?

    @res2001
    Developer, ex-admin
    Возможно он хочет увидеть что-то типа этого:
    puts(sort_string(word));
    Но это блаж какая-то.
    Кроме того в sort_string возможна ошибка выделения памяти (которую вы не обрабатываете) и передавать так, без обработки ошибок ... плохо.
    Ответ написан
  • Какие книги по C++ актуальны на 21 год для обучения с нуля?

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

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

    @res2001
    Developer, ex-admin
    В scanf_s при задании ввода строки, нужно указывать, кроме адреса буфера еще и реальный размер буфера в параметрах. Смотрите пример использования тут: https://en.cppreference.com/w/c/io/fscanf
    Обычный scanf считается не безопасным, и не без оснований, конечно. Поэтому его использование не рекомендуется, о чем в сообщении и пишут. Но это можно обойти, как именно, написано в том же сообщении. Правда задание _CRT_SECURE_NO_WARNINGS влияет не только на использование scanf, но и на пачку других функций.
    Определять #define _CRT_SECURE_NO_WARNINGS нужно до включения любых заголовков стандартной библиотеки. Что бы это определение на них подействовало. Проще всего это сделать в параметрах командной строки компилятора с помощью опции -D_CRT_SECURE_NO_WARNINGS
    Ответ написан
    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() - но она проверяет символ только на цифры, а число может быть разным - например начинаться со знака или если дробное, то в нем будет разделитель дробной части, который может быть первым. Но в простых случаях ее может быть достаточно.
    Ответ написан
    Комментировать
  • Как перекладывать файлы по разным маршрутам?

    @res2001
    Developer, ex-admin
    Аналогичные решения на самописных скриптах регулярно встречал в enterprise среде, да и сам использовал. Потому что гибко, можно заточить как хочется, со всеми вывертами enterprise окружения. Никакой готовый софт обычно не в состоянии обеспечить все потребности на 100%, поэтому используют самописные скрипты.
    На батниках все ваши хотелки можно реализовать, используя дополнительные инструменты командной строки. Если плохо знаете язык, то можете использовать любой известный скриптовый язык или подучить cmd, там не весть какая премудрость. В винде кроме cmd и posh из коробки есть еще VBScript и JScript их то же можно использовать. Хорошо для подобных задач подходит python, но его придется ставить отдельно, часто это бывает не приемлемо.
    Ответ написан
    Комментировать
  • Как правильно построить структуру проекта используя cmake?

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

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

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

    @res2001
    Developer, ex-admin
    Сам дистрибутив, скорее всего лежит где-то в каталоге винды (где хранится и остальной софт, скачанный из MS Store), но он скорее всего не очень много весит.
    Но развернутый в WSL линукс лежит в профиле пользователя. Перенесите профиль на другой диск и будет вам счастье.
    Вообще профиль на другом диске сильно помогает, когда надо переустанавливать винду. Уже лет 15 практикую это везде куда только дотягиваются руки :)
    Ответ написан
    Комментировать
  • Указатель на функцию или атрибут weak?

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

    weak:
    плюсы: статическое связывание (отсутствие накладных расходов на вызов)
    минусы: требуется не стандартная поддержка компилятора (может не работать при использовании другого компилятора, например у компилятора микрософт другой синтаксис для этого), связывание происходит не явно (компилятор сам выбирает какую функцию использовать из подходящих вариантов), для подключения пользовательского функционала требуется пересборка библиотеки

    Условная компиляция:
    плюсы: статическое связывание (отсутствие накладных расходов на вызов), универсальность, явный механизм
    минусы: возможно немного сложней в реализации, чем weak, для подключения пользовательского функционала требуется пересборка библиотеки

    Выводы:
    Если требуется статическое связывание, то выбор - условная компиляция. При грамотной реализации тут можно минимизировать действия пользователя по подключению своей реализации функции в сборку библиотеки. Если библиотеку не планируется выпускать в открытый доступ и не смущает не стандартность - можно использовать weak из-за простоты реализации.
    В остальных случаях - указатель на функцию.
    Ответ написан
    Комментировать
  • Нужно отсортировать все файлы по папкам.?

    @res2001
    Developer, ex-admin
    В вашей задаче несколько проблем:
    1. Убрать двойное расширение. Если расширение всегда фиксировано, то можно просто использовать операцию замены, которая есть в set. Если расширение не фиксировано, то можно использовать 2 вызова процедуры (или вложенные циклы for) и модификатор %%~dpnI.
    2. Выделить подстроку в имени файла. Само имя файла выделить из пути, из которого уже предварительно удалены расширения, можно с помощью модификатора %%~nI. Далее можно использовать цикл for /f для разбиения имени на составные части, разделителем указать символы "+", "-", "_"

    Обход файлов делается в цикле for.

    Для справки смотрите:
    :: тут описание модификаторов и описание разновидностей for
    for /?
    :: операция замены, арифметика, ...
    set /?
    :: Вам нужно будет, скорее всего использовать режим отложенного расширения переменных: ENABLEDELAYEDEXPANSION. Разберитесь с ним, это достаточно тонкий и не очевидный момент
    setlocal /?
    :: просто так
    if /?
    :: Каждая команда cmd имеет свою справку используйте ее. Это основной источник информации по программированию cmd
    ...
    Ответ написан
    9 комментариев
  • Почему процессор не загружается сразу в защищёный или 64 битный режим?

    @res2001
    Developer, ex-admin
    В реальном режиме все несколько проще, т.к. доступны реальные адреса памяти. Например порты устройств доступны по своим реальным адресам. Можно достаточно легко провести предварительную инициализацию оборудования.
    Включение защищенного режима предполагает как минимум наличие прослойки ПО, которая будет работать с MMU - выделять/освобождать память, мапить реальные адреса на виртуальные и т.п. Кроме того сам MMU не включен по умолчанию и его надо включать программно в реальном режиме. Как-то так.
    Ответ написан
    Комментировать