• C выдаёт ошибку при попытке сравнить 2 int?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Отключити оптимизацию и соберите проект в режиме Debug.

    У вас там Undefined Behavior и, очевидно, проблемы работы с памятью. Ошибку вы замечаете не там, где она, собственно, происходит.

    Сразу вижу проблему вот тут:
    strcat(result, alph[mod]);

    Тут вы приписываете строку с адресом alph[mod] к строке по адресу result. Обратите внимание, не строку, начинающуюся с позиции mod в массиве alph, а строку с адресом вроде кода символа 'F'.

    Ну и, вряд ли вы хотите часть строки alph скопировать в result. Плюс у вас в alph[] нет места под терминирущий 0, поэтому strcat вызовет переполнение буфера. Вам там надо дописывать один символ в конец result. Библиотечных функций именно для этого нет. Заведите счетчик количества символов в ответе и тупо переписывайте значение result[cnt].
    Ответ написан
    2 комментария
  • Как выбрать монитор для программиста?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    - Flicker Free.
    - Вместо IPS > VA матрицу (посмотрите глазами на оба, сразу поймете в чем разница).
    - Не менее 24 дюймов (желательно больше, чтобы был именно широким) и разрешение 2/4к.
    Из вашего личного опыта, при работе к какими мониторами у вас напрягались глаза, а с какими нет?

    Если свет вокруг монитора будет аналогичен яркости монитора, то глаза гораздо неменьше напрягаются.
    Ответ написан
    Комментировать
  • Как передать пул белых IP-адресов через интернет с разными провайдерами?

    @dronmaxman
    VoIP Administrator
    AS ("автономная система") не привязана к адресу, соответственно можно договориться с провайдером и настроить пиринг (подключение) на другой локации.

    Другой вопрос, если IP адреса из этой AS необходимы на обоих локациях (адресе1 и адресе2).
    Тогда да, тебе нужен тунель (VPN или GRE или VxLAN или QinQ или ISP privacy vlan) между локациями поверх интернета.

    QinQ или ISP privacy vlan - наверное самый простой вариант в реализации с твоей стороны, надо задать вопрос провайдеру предоставляет ли он такую услугу (протащить через свою сеть нужных тебе vlan)
    Ответ написан
    Комментировать
  • Как передать пул белых IP-адресов через интернет с разными провайдерами?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Автономная система не привязана к провайдеру и может быть перенаправлена к любому провайдеру (и соответственно к вам через другого провайдера) анонсом соответствующих BGP маршрутов https://datatracker.ietf.org/doc/html/rfc7705
    Ответ написан
    Комментировать
  • Стоит ли читать лутца в 2023?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Лучше Лутца ещё ничего не написали. Да и Python за годы с последнего издания сильно не поменялся.
    Ответ написан
    Комментировать
  • Как проанализировать ошибку в установке ssl соединения?

    paran0id
    @paran0id Куратор тега Linux
    Умный, но ленивый
    openssl s_client -connect securepayments.sberbank.ru:443

    в половине случаев получаем:
    $ openssl s_client -connect securepayments.sberbank.ru:443
    CONNECTED(00000003)
    write:errno=104
    ---
    no peer certificate available
    ---
    No client certificate CA names sent
    ---
    SSL handshake has read 0 bytes and written 338 bytes
    Verification: OK
    ---
    New, (NONE), Cipher is (NONE)
    Secure Renegotiation IS NOT supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    Early data was not sent
    Verify return code: 0 (ok)
    ---


    во второй половине - Verify return code: 19 (self-signed certificate in certificate chain), что означает отсутствие корневого сертификата

    такое впечатление, что там балансировщик кидает то на хороший сервер, то на плохой
    Ответ написан
    2 комментария
  • Задания с CodeForces. Вариант решения есть, но не подходит для всех тестов. Может неправильно понял реализацию решения?

    Alexandroppolus
    @Alexandroppolus
    кодир
    тебе надо отдельно рассмотреть D > 0 и D < 0, потому что в первом кейсе сначала едем вверх по 3 этажа и потом чуть вниз по 2, а во втором - сначала вниз по 2 этажа, потом чуть вверх по 3

    далее, в первом случае могут быть 3 кейса, по остатку от деления D на 3. Если 0, то "-2" не понадобится, если 1, то можно будет обойтись одним нажатием на "-2", иначе двумя. Для D<0 - аналогично.

    и всё можно решить формулами, без цикла, за O(1)
    Ответ написан
    5 комментариев
  • Как на одном IP-адресе прикрутить несколько доменов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SRV вам тут не поможет, браузеры с SRV-записями не работают.
    Вам нужно в DNS сделать CNAME-запись для admin.qwerty.ru на qwerty.ru, на сайте добавить admin.qwerty.ru как псевдоним и сделать перенаправление с этого адреса на qwerty.ru:8006.
    Ответ написан
    Комментировать
  • Как исправить данную оишбку?

    @dima20155
    you don't choose c++. It chooses you
    Проблема в операторе []
    А именно в условии
    while (current->next != NULL)
    Должно быть
    while (current != NULL)

    Также у вас данный оператор не возвращает ничего в случае, индекс больше, чем количество элементов в листе, а также не проверяет условие по типу:
    index < size

    Помимо этого у вас ещё много проблем в коде, но если вы начинающий, то что же, учитесь, все впереди. Попробуйти найти себе человека, который сможет скорректировать/отревьюить ваш код, потому в текущем виде он весьма плохо может работать, из-за сырых указателей, таких же сырых выделений памяти, отсутствия её освобождения, непонятно зачем наличие оператора [] у linked list (в стандартной библиотеки их нет не случайно и нужна веская причина чтобы пользоваться оператором [] в linked list )
    Ответ написан
    1 комментарий
  • Какой VPN выбрать?

    xenon
    @xenon
    Too drunk to fsck
    Я бы все-таки предпочел wireguard и пока что не слишком волновался насчет того, что его блокируют - это все легко обходится. Раз у вас свой сервер, то решается все легко.

    Думать о том, как там будет через 3 года, и готовиться обязательно к самому худшему сценарию пока не нужно. А то потратите силы на подготовку к самому худшему, а он не случится - обидно будет. Но даже если случится, через три года если что и переставите, а там может или шах или ишак. А все это время лучше жить с быстрым VPN, пользоваться которым одно удовольствие. И ставится он "красиво", системным способом, а не как Outline.

    У wg очень простая сигнатура для DPI, поэтому легко его детектят и блочат. Но для этой проблемы несколько вариантов решений.

    Решение 1 от ValdikSS : Сначала с того же клиентского порта и на тот же серверный "пробить" соединение другим пакетом (без сигнатуры). Так как для DPI этот пакет - часть соединения, то оно уже не похоже на wg. А вот wg сервер просто проигнорирует первый мусорный пакет, выбросит, а на второй ответит.

    wg0.conf: ListenPort = 56789

    sudo nping --udp --count 1 --data-length 16 --source-port 56789 --dest-port DEST_PORT DEST_IP


    Как проверить, что wireguard не заблокирован?
    https://ntc.party/t/wireguard/4968/6
    (обратите внимание на то, что на клиенте нужно зафиксировать ListenPort)

    2. Тот же самый эффект, но без ручного запуска nping каждый раз (просто автоматизируем то же решение):
    в конфиг wg (wg0.conf или какой у вас) просто пишем:
    [Interface]
    PrivateKey = ....
    Address = 10.9.0.2/24
    ListenPort = 12345
    
    PreUp = nping --udp --count 1 --data-length 16 --source-port 12345 --dest-port 12345 123.123.123.123


    3. Можно чуть больше заморочиться, и замаскировать (обфусцировать) wg трафик через netfilter - если на клиенте и сервере закодировать его с одинаковым ключом (и самым простым шифрованием) - DPI его не видит.
    https://github.com/infinet/xt_wgobfs

    В общем, wireguard сам по себе искаропки не умеет "прятаться" (это и не его задача), но если нужно его спрятать - это делается в две минуты. (Ну первый раз подольше, пока разбираешься). Силы зла и негетеросексуализма и так уже вынуждены применять дорогой и тяжелый DPI для блокировки очень простого VPN. Блокировать обфусцированный, как в этих примерах - на порядок (порядки) сложнее (если вообще возможно) и точно неэффективно - огромные затраты, чтоб заблочить VPN всего паре десятков тысяч ITшников, которые тут же как-то иначе наладят себе VPNы (в крайнем случае перейдут на Outline или что-то еще) - бессмысленно, поэтому, думаю, никогда и не случится.
    Ответ написан
    Комментировать
  • Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    0. Направление не новое и хорошо изученное.

    1. Зависит от того, какое именно ПО.
    Что-то пишется на Си, что-то на языках высокого уровня, а что-то реализуется на уровне железа (плис/fpga/asic)
    Для моделирования каких-то процессов может использоваться уже упомянутый матлаб, например.

    2. Изучать нужно теорию управления и физику, тк по сути всё управление моторами базируется на ней - а это по сути основная и единственная задача, как удержать дрон в воздухе, не сталкиваться с препятствиями при движении, а в случае отсутствия движения - оставаться на месте.
    По разработке - собственно Си для микроконтроллеров и verilog для железа. По хорошему ещё электронщиком нужно быть.
    Не сильно от обычной embedded разработки отличается, выходит.

    А на высоком уровне - там уже на конкретную задачу нужно смотреть. Где-то может даже ML и компьютерное зрение понадобится.
    Получается тоже не так уж много отличий от обычной разработки.
    Ответ написан
    Комментировать
  • Генератор случайных чисел ИНОГДА (очень редко!) возвращает NaN?

    adeshere
    @adeshere Автор вопроса
    РАН, Фортран, временные ряды
    Спустя полтора года, завеса тайны все-таки начала спадать!
    Во-первых, благодаря вот этому совету Дмитрия Чернова, баг удалось локализовать. А именно, Дмитрий предположил, что проблему надо искать в контексте x87 FPU, и что добавление
    пары asm- команд
    Прямую вставку asm- команд в код мой фортран-компилятор не умеет, но все необходимое делает ключ Qfp-stack-check
    в подозрительных местах приведет к вылету программы по Access Violation именно в том месте, где что-то пошло не так. А не спустя какое-то время, когда я снова полезу в FPU и получу Nan, например, в ГСЧ. Эта идея сработала, и я получил Access Violation в совершенно безопасной (как мне казалось)
    функции
    SUBROUTINE SCREEN_PUTL0_TIME(TEXT)
    USE ABD_INC;  USE HEADERS
    character, intent(in) :: text*(*)
    integer*4, save :: isw=0
    c
    c     При самом первом вызове таймера isw=0, функция вернет 0
    c     При последующих (isw=1) - вернет интервал от момента инициализации
    t=timer_mm(5,isw) 
    isw=1
    if (t < $Screen_counter_time) return
    c    В крайнем  случае (если в момент начала внешнего цикла таймер уже
    c    инициализирован) функция первый раз напечатает % сразу при старте,
    c    а не через $Screen_counter_time после запуска цикла
    c   
       call screen_putl0(text)
       t=timer_mm(5,0)         ! Реинициализация таймера после печати строки
    end

    Эта функция печатает на экран % выполнения (он передается в строке TEXT), но с интервалом не менее $Screen_counter_time. Для проверки времени, прошедшего с прошлой печати, вызывается самодельный таймер t=timer_mm(5,isw) Первый параметр функции - это номер таймера (их там у меня целый массив для разных нужд). А второй параметр работает так: если isw=0, то таймер засекает время, а в остальных случаях возвращает число секунд, прошедших с момента инициализации счетчика. Ну вот так было когда-то сделано, чтобы обойтись одной функцией вместо двух....
    Таким образом, когда я дергаю инициализацию таймера, то его возвращаемое значение меня не интересует. Именно это и происходит в предпоследней строке кода выше:
    t=timer_mm(5,0)
    Результат выполнения функции как бы присваивается переменной t, но больше она нигде не используется . Как оказалось, именно здесь и была зарыта собака.

    А дальше уже было проще. В коде под спойлером у меня есть вызов функции типа real*4, от которого мне был нужен только побочный эффект (инициализация таймера), а вот возвращаемое значение функции нигде не используется. В принципе,
    это легально
    По идее, компилятор в такой ситуации должен после вызова функции восстановить стек x87 FPU, а возвращаемое значение никуда не копировать. В других местах кода у меня есть аналогичные вызовы (когда возвращаемое значение не используется), и это не приводит к каким-то багам. Ну и язык официально нигде не требует, чтобы возвращаемое значение функции обязательно было куда-то использовано ;-)

    Но как оказалось, именно это и провоцировало проблему. Этот фрагмент библиотеки у меня состоит из кучи очень небольших (5-10 строк) взаимосвязанных функций с частично повторяющимся кодом. Оптимизатор делал из них жуткое спагетти, дробя эти функции на еще более мелкие фрагменты и инлайня их направо и налево. И, видимо, где-то в ходе этих оптимизаций он "забывал" восстановить (очистить?) стек FPU.

    В общем, для исправления бага оказалось достаточно заменить локальную переменную t на глобальную. Про нее оптимизатор не знает - будет ли она нужна, или нет. Поэтому он просто вынужден извлекать из сопроцессора результат FP-вычисления, чтобы запихнуть его в это место ;-)

    Огромное спасибо Дмитрию, который сначала выдвинул правильную версию происхождения бага, а потом помог его точно локализовать и убрать! Тестовая программа работает уже час и пока ни одного Nan-а не появилось. ;-)
    Ответ написан
    Комментировать
  • В чем суть приватных IP адресов, если можно выдавать любые IP и затем их Натить?

    @Drno
    Когда тебе понадобится зайти на белый IP из этой подсети, ты на него не попадешь, т.к. он будет искаться в первую очередь у тебя в локалке
    Ответ написан
    1 комментарий
  • Как правильно структурировать проект C?

    @tin_vsl
    Senior Developer
    Скорее всего вам нужно перечислять файлы в другом порядке, чтобы они собирались в правильном порядке и их содержимое было видно там, где будет использоваться.

    Для первого варианта, думаю так:
    add_library(dbc printer.c library.c library.h)
    Ответ написан
    Комментировать
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вообще, char - integral type. Поэтому передавать туда числовую константу можно - это никакой не варнинг. Компилятор сам понимает, что она должна быть типа char и даже проверяет на переполнение и выдает warning, если что.
    Ответ написан
    2 комментария
  • Почему free() выводит ошибку?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Какая-то проблема из-за чего один и тот же элемент удаляется дважды, судя по всему.

    Вижу сразу ошибку в delete_node: Если вершина в списке всего одна, произойдет фингя: this_list->last не обновится, да и next_node->prev несуществующее будет переписано.
    Ответ написан
    2 комментария
  • Есть ли название у подобного подхода?

    What is an early return?
    An early return, or “return early” is an approach to keep readability in functions and methods.

    It is always considered a wise choice to return early if simple conditions apply that can be checked at the beginning of a method.
    https://dev.to/jpswade/return-early-12o5
    Ответ написан
    1 комментарий
  • Как на компьютере с Windows XP открыть шару с сервера 2019?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Видимо политики нового домена разрешают другой набор шифров и сервер и клиенты не могут договориться между собой.
    Вообще такие вещи по логам evetnvwr диагностируются.
    Ответ написан
    2 комментария
  • Как реализовать взаимодействие нескольких библиотек между собой на c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо системное апи использовать. Вы, похоже, под виндой, так что LoadLibraryEx, GetModuleHandleEx, GetProcessAddress вам помогут. Первой вы открываете библиотеку. Второй можно потом пользоваться чтобы получить доступ к уже открытой библиотеке, если вы HANDLE не сохранили куда-то. Третья позволит вам получить указатель на функцию из библиотеки.

    Можно гуглить "имя функции example" и тогда вы найдете в интеренете готовый код, работающий с этими функциями.
    Ответ написан
    Комментировать
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В данном исходнике нет проблемы атомиков. Но здесь есть проблема отсутсвия синхронизации потоков а и b.
    Нужно наладить синхронизацию и дальше атомики станут приносить ощутимую пользу.
    Ответ написан
    Комментировать