• Чем меньше символов, пробелов и пропусков в коде, тем лучше?

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