Задать вопрос
  • В чем смысл do while? Как его можно использовать?

    @res2001
    Developer, ex-admin
    Например, функции ввода/вывода в POSIX возвращают EINTR, если во время их работы в приложение пришел сигнал.
    Сигнал вы можете перехватить, обработать и можно продолжать дальше. Но функция (например write) вернет EINTR. Если эту ситуацию не обрабатывать отдельно, то это может вызвать, например, завершение приложения (из-за ошибки ввода/вывода), тогда как приложение могло бы дальше работать.
    В этом случае удобно вызов функции заключать в do while:
    int ret;
    do {
      ret = write(...);
    } while(ret == EINTR);

    Это один из вариантов, когда надо выполнить действие, и по результатам действия будет понятно надо ли еще раз его запустить или уже достаточно.
    В этот же цикл можно добавить и другой функционал.
    В случае неблокируемых операций ввода/вывода операция может завершится не записав или не прочитав все что нужно или вообще вернуть EAGAIN, если ничего нет. Можно эти проверки добавить в этот же цикл do while вместе с проверкой на EINTR.
    Вариантов использования, на самом деле много. Вы это увидите, когда столкнетесь с таким вариантом в своей практике.

    Но самый популярный вариант у Си программистов, это использование в макросах:
    #define MACRO(x)      do { тут что-то делаем } while(0)

    Этот фиктивный цикл служит двум целям:
    1. внутри цикла можно объявлять локальные переменные, которые не будут видны вне цикла
    2. При использовании макроса можно в конце ставить точку с запятой, не нарываясь на предупреждения компилятора: MACRO(val);. Компилятор в итоге уберет цикл, но все побочные эффекты сохранятся.
    В плюсах этот вариант практически не используется, т.к. тут есть шаблоны и т.п. и от макросов в основном отказываются. Но в Си макросы вполне актуальный инструмент.

    Но циклы for и while применяются чаще, чем do while.
    Ответ написан
    Комментировать
  • Как получить доступ к роутеру из интернета?

    @res2001
    Developer, ex-admin
    По умолчанию роутеры настроены так, что их нельзя админить с WAN порта. Но это можно изменить настройками.
    Но не советую этого делать, т.к. ... Когда ты последний раз обновлял роутер? Как часто это делаешь? Роутеры то же ломают.
    Можно поднять на роутере ВПН и админить роутер через ВПН.
    Ответ написан
    Комментировать
  • Можно ли создать пустую структуру, а потом её заполнить внутри функции?

    @res2001
    Developer, ex-admin
    В плюсах структуры это те же классы, но у них по умолчанию используется модификатор доступа public, а в классах private - это вся разница между ними.
    Напишите для структуры конструктор по умолчанию, в котором будете присваивать нужные значения членам структуры. После этого при объявлении любого экземпляра структуры:
    Date date;
    члены структуры будут принимать значения, заданные в конструкторе по умолчанию.
    Ответ написан
  • Как сохранить текст из окна батника в txt файл?

    @res2001
    Developer, ex-admin
    Чтоб сохранить текст от ffmpeg надо делать так:
    ffmpeg -i vidov_ska4ali_1.mp4 -hide_banner -v verbose >output.txt

    Чтоб не запускать ffmpeg 2 раза я бы рекомендовал следующую схему:
    ffmpeg -i vidov_ska4ali_1.mp4 -hide_banner -v verbose >ffmpeg_out.txt
    for /f "tokens=3,4 delims=x" %%a in ('type ffmpeg_out.txt ^| findstr /C:"Stream.*Video" ') do (
      set "width=%%a"
      set "height=%%b"
    )
    ( type ffmpeg_out.txt & echo Width: %width% Height: %height%) >output.txt
    del /f/q ffmpeg_out.txt

    Т.е. через промежуточный файл, в котором сохраняется вывод ffmpeg.
    У вас значения width и height пустые, это значит, что скорее всего не правильно отрабатывает фильтр findstr, или "токенизация" в цикле.
    Ответ написан
    5 комментариев
  • Актуальная литература для C++?

    @res2001
    Developer, ex-admin
    Есть такая книжка: https://dmkpress.com/catalog/computer/programming/...
    Пока не покупал и не читал.
    Судя по представленному оглавлению (и по количеству страниц) в книге описаны только новшества по сравнению с предыдущим стандартом. Так что старые добрые толстые книжки/учебники по плюсам, дающие хорошее начальное введение в язык, но не уделяющие должного внимания различиям в версиях, никто не отменял. Т.е. только по этой книге вы не сможете освоить язык. Она вам понадобится уже после освоения учебника.
    У того же издательства была книга по С++17, но там уклон в сторону embeded разработки.
    Ответ написан
    1 комментарий
  • Почему не работает пузырьковая сортировка двумерного динамического массива?

    @res2001
    Developer, ex-admin
    1. В result в цикле сортировки вложенный цикл должен быть до y, а у тебя до х, так же как верхний цикл.
    2. Как писал mayton2019 для сортировки не хватает дополнительного цикла. Просто сделай сначала сортировку одномерного массива и поймешь зачем он. Сейчас у тебя только одна итерация сортировки для каждой колонки проходит.
    3. Посмотри внимательно сюда:
    int temp = Arr[i][j + 1];
    Arr[i][j] = Arr[i][j];
    Arr[i][j + 1] = temp;

    И пойми, что этот код ничего местами не меняет. А должен.
    Ответ написан
    2 комментария
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @res2001
    Developer, ex-admin
    Можно использовать std::malloc вместо new.
    Если класс полиморфный, то можно предварительно вычислять max из размеров всех детей и использовать это значение для выделения массива. Список детей должен быть заранее известен.
    Ответ написан
    1 комментарий
  • Как в деструкторе базового класса вызвать переопределённый метод?

    @res2001
    Developer, ex-admin
    Никак. Когда работает деструктор базового класса объект наследник уже не существует.
    Так что "чистите" наследник в деструкторе наследника, а базовый класс в деструкторе базового класса.
    Вот старинная статья на хабре, но, на сколько я знаю, и сейчас все работает так.
    Ответ написан
    Комментировать
  • Почему показывает в echo не верное значение?

    @res2001
    Developer, ex-admin
    1. Команда
    set /p filemp3sek=23
    Не присваивает переменной filemp3sek значение 23, как, возможно, вы думали. В данном случае 23 - это приглашение для ввода. Ключ /p заставляет команду set принять значение введенное с клавиатуры. Если ничего не ввести и нажать на Enter, то значение переменной не определено (переменная не существует).
    Просто уберите ключ /p

    2. Блок else является частью команды if. Но в батниках команда (любая) должна быть записана в одной строке. Но в команде if можно использовать круглые скобки, чтоб тело if можно было удобно записывать на разных строках, а не комкать все в нечитаемый текст в одной строке. Но как только вы пишете закрывающую блок скобку это действие завершается. Следовательно фразу else и следующие за ней ifы вместе со следующей открывающей скобкой надо писать в одной строке с предыдущей закрывающей скобкой. Работающий пример:
    if %filemp3sek% GEQ 1 if %filemp3sek% LEQ 10 (
    set skolkoRazUsaemJpg=1
    ) else if %filemp3sek% GEQ 11 if %filemp3sek% LEQ 15 (
    set skolkoRazUsaemJpg=2
    ) else if %filemp3sek% GEQ 16 if %filemp3sek% LEQ 20 (
    ...
    Ответ написан
    Комментировать
  • Может ли совпадать количество ip адресов в подсети с количеством узлов сети?

    @res2001
    Developer, ex-admin
    Согласен с ответом chupasaurus
    Но даже если не принимать во внимание broadcast адрес, то если в сети нет свободных адресов - это говорит о том, что нельзя легко добавить дополнительные узлы в сеть. А это плохо в большинстве случаев. На практике в рабочих (и домашних) сетях никогда такого не встречал. Нормально, когда 10-20% адресов свободны (в домашних условиях и малых сетях свободны обычно 95% адресов). Если количество свободных адресов <5%, то стоит задуматься о разделении сети или увеличении маски.
    Ответ написан
    Комментировать
  • Не получается вернуть строку. Как исправить?

    @res2001
    Developer, ex-admin
    1. Лучше бы вы использовали std::string, а не нативные ("сырые") строки.
    2. Нативные строки - это не строки в привычном для С++ смысле (и в смысле интерпретируемых ЯП). У них нет встроенных операций типа конкатенации, выделения подстрок и т.п. Все это реализуется функциями в стиле Си str*
    3. Если вы хотите вернуть сырую строку, то надо:
    3.1. Массив под строку выделять в динамической памяти (или передавать его как параметр в функцию и его заполнять). Сейчас у вас автоматический массив, а он исчезнет, как только отработает оператор return и строка по факту не вернется (хотя вернется указатель, но он будет указывать в место на стеке, в котором уже нет вашей строки).
    3.2. Возвращать char*. Сейчас тип возвращаемого значения в вашей функции char - а это один символ, а не строка.
    4. Размер строки явно будет больше, чем size байт. На сколько больше - нельзя сказать заранее. Поэтому обычно выделяют достаточно большой буфер с запасом, чтоб покрыть все возможные варианты и при добавлении в буфер очередной подстроки контролируют размер буфера - чтоб оставалось место для очередной добавляемого куска и завершающего нулевого символа. Строка может быть равна size только в случае, если все числа в массиве будут состоять из одной десятичной цифры. Да и в этом случае требуется дополнительный байт на нулевой символ. Так что минимальный размер буфера должен быть size+1, реально он должен быть еще больше.
    Ответ написан
    Комментировать
  • Кроссплатформенное программирование на C?

    @res2001
    Developer, ex-admin
    Тут не важно GUI или нет (может быть любой интерфейс - сеть, файлы, потоки, процессы, и т.п. системные интерфейсы). Подход один и тот же. Если нужна кроссплатформенность, то ищите кроссплатформенные библиотеки, реализующие нужный интерфейс. Если таких нет (видимо плохо искал), то пишите свою. Это довольно сложно.
    Ответ написан
    Комментировать
  • Как сделать что бы через некоторое время ноутбук работал от сети?

    @res2001
    Developer, ex-admin
    Не важно, что написано на экране - это все го лишь надпись, она может отражать действительность, а может и не отражать.
    Есть ноуты, которые могут работать напрямую от зарядки, а есть те которые работают исключительно от батареи и если у такого вытащить батарею, то он вообще не заведется. Сейчас у многих ноутов батарея несъемная (т.е. чтоб ее снять, надо разобрать ноут) и скорее всего такие модели работают всегда через батарею.
    Мое имхо - это реализовано в железе и программно это поведение никак не поменять.
    Ответ написан
  • Верно ли настроены данные конфигурации для клиента и сервера в OpenVPN?

    @res2001
    Developer, ex-admin
    Что за адрес у вас указан в опции server? Тут обычно указывают какую-то серую подсеть для того, что бы ее адреса использовались внутри ВПН. Адреса из под сети 169.254.х.х обычно используются при проблемах с назначением адреса (ошибка получения по DHCP и т.п.). Думаю не стоит использовать эту подсеть в принципе.

    Зачем вам ВПН внутри локальной сети (192.168.1.158)?

    Клиент пытается подключиться к серверу 192.168.1.158:1194.
    Скорее всего, ошибка связана с тем, что сервер не доступен по указанному адресу.
    Ответ написан
    1 комментарий
  • Как обращаться к устройствам, находящимся за NAT?

    @res2001
    Developer, ex-admin
    Т.к. Н1 и Н2 находятся в одной сети, то они имеют доступ друг к другу напрямую.
    Вопрос в том поднят ли NAT на H1?
    Если нет, то на H2 достаточно прописать маршрут до сети 192.168.2.0/24 через Н1, а на Н1 разрешить пересылку пакетов (скорее всего это уже у вас работает).
    Если на Н1 NAT поднят, то надо пробросить нужные порты на NAT в H1 на телефон.
    Ну и в обоих случаях не забыть проковырять нужные дырки в фаерволах.

    При это NAT на роутере значения не имеет, т.к. все происходит внутри LAN роутера.
    Ответ написан
    Комментировать
  • Как снизить загрузку памяти 56% на Windows 11?

    @res2001
    Developer, ex-admin
    В винде есть кэш программ, т.е. винда подгружает сама программы в память по одной ей ведомому алгоритму. Это делается для того, чтобы уменьшить время запуска программ. На этот кэш может уходить значительная часть занятой памяти. Этот кэш достаточно гибкий. Если у вас будет нехватка памяти, то винда может уменьшить размер кэша и т.п.
    Можете погуглить по prefetch и/или superfetch.
    При желании этот механизм можно выключить. Обычно в этом нет смысла.
    Так что высокая загрузка памяти даже при только что установленной винде - это нормально.
    Ответ написан
  • Вылетают приложения даже после переустановки винды 10. Что делать?

    @res2001
    Developer, ex-admin
    Тест памяти, тест дисков, полная проверка на вирусы с загрузочного носителя.
    Переустановка винды с полным форматированием всех дисков.
    Установка хорошего антивируса.

    Если аппаратных проблем нет (диск, память), то, видимо, ваша подруга, ходит по одним и тем же сайтам в интернете и ловит один и тот же вирус. Если текущий антивирь его не находит, видимо, надо сменить антивирус. У касперского есть вариант для создания загрузочной флешки с анитвирусом.
    И пока вы не отучите ходить ее по злачным местам или не подберете антивирус, который будет ловить эту заразу - это будет продолжаться бесконечно.
    Ответ написан
    Комментировать
  • Задача по математики из 5-го класса которая завела меня в ступор?

    @res2001
    Developer, ex-admin
    4 - откуда взялось то? гараж то у нас 1. Так что 3 гаража стоят 258300. 1 гараж стоит 86100, как на первом скрине.
    Во втором скрине ошибки с самого начала.
    1 машина = 2 гаража + 97300.
    2 гаража + 97300 + 1 гараж = 355600
    3 гаража = 355600 - 97300 = 258300
    1 гараж = 258300/3 = 86100
    Ответ написан
    Комментировать
  • Какие части ПО могут быть общие у 2 операц. систем Wind-ы на 2 дисках разных? Лагает рабочий стол?

    @res2001
    Developer, ex-admin
    Возможно глюки какого-то из драйверов, может быть видео драйвера.
    Видимо, драйвер один и тот же используется в обеих виндах. Поэтому и ведет себя одинаково. Сам драйвер установлен в разные метса, но он один и тот же.
    Попробуйте обновить драйвер с сайта производителя. Или если уже стоит последняя версия - понизить версию.

    На счет загрузки ЦП - 10-20%% может быть не показатель. Если ядер много, а 10-20%% это средняя цифра по всем ядрам, то одно из ядер может быть загружена на 100%, а остальные по 1%. В менеджере задач включите отображение графика загрузки ЦП для всех ядрер.
    Ответ написан
    Комментировать
  • Как настроить доступ в локальную сеть через Openvpn?

    @res2001
    Developer, ex-admin
    Компы во внутренней сети, что-то знают о сети ВПН? Там же другие адреса - это другая сеть. Маршрутизация как настроена? Не достаточно того, что бы клиент ВПН знал маршрут до другой сети через ВПН, надо еще и что бы эта "другая" сеть знала маршрут до клиентов ВПН.
    push "route 192.168.100.0 255.255.255.0" - только добавляет маршурт на клиента, но ничего не делает с компами внутри сети.
    Просто пропишите маршруты до ВПН сети через ВПН сервер на компах внутри сети, которым нужен обмен с клиентами ВПН.
    Так же не забудьте про фаерволы.
    Ответ написан
    7 комментариев