• С++ На всех ли платформах одинаковая точность операций с float?

    @res2001
    Developer, ex-admin
    Форматы чисел с плавающей точкой стандартизованы IEEE754.
    Скорее всего, операции выполняемые процессором над числами с плавающей точкой будут давать одинаковый результат на разных платформах.
    Но вот программные реализации различных математических алгоритмов из стандартной библиотеки, типа того же sqrt и т.п., могут отличаться.
    Для гарантии, вам нужно использовать для этих целей какую-то единую библиотеку для всех платформ, а не стандартный math.h.
    Ответ написан
    1 комментарий
  • Откуда OpenSSH Server грузит ключи?

    @res2001
    Developer, ex-admin
    Обычно пользовательские ключи лежат в пользовательских профилях в каталоге .ssh: cd %USERPROFILE%\<user name>\.ssh
    Так же как в линухе. Там их и ищет сервер.
    Но у вас для чего то в конфиге 2 опции AuthorizedKeysFile. Возможно одна из них лишняя.
    Ответ написан
    Комментировать
  • Как быстро округлить timestamp до секунд, минут, часов, дней и т.д.?

    @res2001
    Developer, ex-admin
    Думаю, для округления вплоть до дней можно просто отбрасывать остаток от деления на соответствующую константу. Константы вычислить заранее для 1 дня, 1 часа и 1 минуты.
    Округление до года и месяца - по предложенной jcmvbkbc схеме.
    Ответ написан
    Комментировать
  • Как показать все листья в бинарном дереве?

    @res2001
    Developer, ex-admin
    Листьями в дереве считаются узлы, у которых нет потомков.
    Потомки в коде задаются членами узла left и right, соответственно if(p->left == NULL && p->right == NULL), то узел - лист.
    Делаете проход по всем узлам и выводите только те узлы, где условие выполняется.
    Ответ написан
    Комментировать
  • Почему fopen устанавливает ошибку Invalid argument в errno при fopen в режиме r+ после w и fopen в режиме w+ после r?

    @res2001
    Developer, ex-admin
    Интересный вопрос. Ответа у меня нет, что-то не приходилось использовать режимы "+".
    Попробуйте обнулять errno перед вызовом fopen. Возможно значение, осталось от предыдущего вызова. Вообще читать errno надо, только если fopen вернул NULL. При нормальном завершении errno не меняется.
    И если pFile == NULL, очевидно, что не надо вызывать fclose.
    Ответ написан
  • Чем меньше символов, пробелов и пропусков в коде, тем лучше?

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

    @res2001
    Developer, ex-admin
    Про size_t - если вы на 100% уверены, что у вас никогда не случится потеря данных при преобразовании из 8 байтного беззнакового size_t в 4 байтный знаковый int, то можете сделать явное преобразование типов (cast). Но гораздо правильней для размера (всего чего угодно) использовать size_t (а не int), как это давно уже делают в std.
    Про strncpy - в некоторых случаях она может быть не безопасной. Если вы на 100% уверены, что в вашем случае она точно безопасна, то можно забить на ошибку, объявить макрос, который указан в тексте ошибки и на этом проблема будет исчерпана. Но есть безопасные аналоги строковых функций у них к имени добавляется суффикс _s. В вашем случае безопасный аналог strncpy_s. Используйте безопасные функции. Безопасные функции немного медленней работают, за счет дополнительных проверок и т.п.
    Ответ написан
    6 комментариев
  • Как передать статический двумерный массив типа float в функцию типа void в качестве аргумента на языке C?

    @res2001
    Developer, ex-admin
    1. В двумерных массивах в Си данные располагаются в памяти по строчно, т.е. сначала идет первая строка массива, затем вторая и т.д. У вас же индекс по строкам указан вторым. Вас тут спасает только то, что матрица квадратная и количество строк равно количеству столбцов.
    2. Внутри функции переданный массив - это не массив, это указатель float *nameMatrix. Соответственно вы не можете делать двойную индексацию nameMatrix[x][y]. Вам надо вычислять индекс вручную:
    *(nameMatrix + y * columnsMatrix + x) = a * (x + 1) * powf(sinf(y + b), 2);

    Для справки, индексация массива это синтаксический сахар для следующей операции: *(nameMatrix + i)
    Ответ написан
    Комментировать
  • Как правильно настроить фильтрацию по портам и ip локальной и глобальной сети в роутере?

    @res2001
    Developer, ex-admin
    Для работы веба в большинстве случаев достаточно:
    1. DNS: UDP, dst=any:53
    2. HTTP/HTTPS: TCP, dst=any:443/80

    DNS нужен, чтоб преобразовывать имена доменов в IP адреса.

    Адреса источника - вся локальная сеть, порты источника - любые. Локальные порты обычно динамические, там большая группа портов, конкретный диапазон динамических портов может зависеть от клиентской ОС, так что тут нет смысла как-то ограничивать.

    По портам назначения могут быть дополнительные нюансы, в зависимости от сайтов. Это надо дополнительно анализировать для каждого конкретного сайта, если там что-то не будет работать.

    Если у вас используются еще какие-то службы в интернете, то соответственно их нужно открывать отдельно.

    Любые IP адреса не будут лезть в локальную сеть, только те куда ваши локальные устройства сначала отправят запрос (будет приходить ответ). Точнее они будут пытаться лезть, но дальше роутера не уйдут - там же у вас еще, видимо, NAT работает, вот он их и будет останавливать.
    Ответ написан
    Комментировать
  • Дублирующиеся столбцы - это плохо?

    @res2001
    Developer, ex-admin
    5-6 секунд с inner join - это должно быть несколько миллиардов (сотен миллионов) записей в обоих таблицах.
    Попробуйте создавать индексы по полям участвующим в связывании таблиц.
    Денормализация данных - обычно плохой вариант. Есть некоторые кейсы, когда это допустимо, но лучше этого избегать, пока не перепробованы другие варианты ускорения.
    Ответ написан
    Комментировать
  • В чем смысл 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 (
    ...
    Ответ написан
    Комментировать