• Проблема с двусвязным списком?

    @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 не включен по умолчанию и его надо включать программно в реальном режиме. Как-то так.
    Ответ написан
    Комментировать
  • Где ошибка.....?

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

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

    @res2001
    Developer, ex-admin
    Если не хотите АД, то легких путей не ждите. АД - это и есть легкий путь.

    Для начала вам нужно на всех компах в сети:
    1. Завести одного пользователя (с одним и тем же паролем) с правами администратора. На компах админов то же нужно завести такого же пользователя.
    2. Настроить удаленный доступ по RDP на всех компах как минимум для админа
    3. Дать четкие имена компам, что бы вы могли без труда по имени/фамилии сотрудника (номеру телефона или чему-то еще) определить проблемный комп. Можно в качестве wallpaper вывести IP адрес и другую инфу, для этого есть соответствующий софт.
    4. Включить "доступ к файлам и принтерам"
    5. Убрать права администратора у пользователей
    6. Начиная от Windows Vista и дальше, нужно выключить UAC для удаленного запуска программ. Делается это правкой реестра:
    reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f


    В винде почти все администраторские операции на локальном компе можно делать удаленно. Вышеприведенные настройки позволят это делать (пп.1,3,4).
    В винде почти все инструменты для удаленного администрирования уже есть из коробки.

    П.2 позволит подключиться к рабочему столу и потрогать руками, не отрывая задницы от своего кресла.
    В RDP есть такая штука как remote shadow - это дает возможность удаленно подключаться к рабочему столу пользователя одновременно с пользователем (т.е. пользователь будет видеть все ваши действия, так же как и вы его). Часто это бывает удобно, но требует специфической настройки. В инете есть информация, ищите.
    П.5 - это обычная мера безопасности, которая обеспечит 50% безопасности вашей сети.
    П,6 - без этого пункта вы не сможете удаленно выполнять программы, требующие админских прав, на компах. Сам UAC отключать не стоит, вещь достаточно полезная.

    Имея эту базу, дальше вы уже можете прикручивать к сети прокси, фаерволы, почтовики и т.д. и т.п. не сильно отвлекаясь на поддержку пользователей и компов в сети.
    Но не ждите, что кто-то или что-то сделает эту работу за вас. Таких чудесных программ не существует. Вам придется погружаться во все детали самому.
    Изучите хотя бы один скриптовый язык программирования, встроенный в винду из коробки: cmd, powershell, JScript, VBScript. Сейчас, пожалуй, самый актуальный powershell. Это поможет частично автоматизировать ваши процессы.

    PS: Если что я 10 лет админил одноранговую сеть из более чем 100 компов. АД там не разворачивалась по "идеологическим" причинам я в этом был не виноват :-)
    Ответ написан
    6 комментариев
  • Как настроить ninja под windows?

    @res2001
    Developer, ex-admin
    При установке MSVS устанавливаются вместе с ним несколько батников, которые настраивают среду для сборки.
    У меня в MSVS 2017 они называются "Native tools command promtp ...". В других версиях MSVS название может немного меняться. Батники находятся в меню Пуск в папке MSVS.
    Запустите подходящий батник, он настроит среду сборки и запустит командную строку. Там и выполняйте сборку вашего проекта. При этом никаких ручных настроек не требуется.

    PS: зря вы установили MSVS не в каталог по умолчанию - могут быть трудно диагностируемые проблемы при сборке из командной строки. Возможно вы как раз с этим и столкнулись.
    Ответ написан
    Комментировать