Задать вопрос
  • Как найти родителя заданного элемента в бинарном дереве?

    @res2001
    ColdHandGuy, Проверку на NULL указателей на потомков надо делать до любого обращения по этим указателям, иначе эта проверка не имеет смысла. Напомню, если вы обратитесь по не действительному указателю или указателю содержащему NULL ваша программа будет аварийно остановлена.
    if((root->left_child != NULL && root->left_child->data == x) || (root->right_child != NULL && root->right_child->data == x))
    ...
    if(root->left_child != NULL && root->left_child->data < x)

    Работает только если искать потомки корня

    Если не считать не корректной проверки на NULL, то все остальное выглядит нормально, по идее должна искать и глубже.
    Дерево у вас правильно сформировано? Перед поиском выведите дерево на экран. Можете сюда его выложить.
  • Как реализовать дерево на основе связного списка?

    @res2001
    Axretit, чтоб был просто конвертер вам нужно дерево, чтоб из него переносить элементы в список.
    Да, смысла в подобном дереве не много, но в качестве учебной - вполне не плохая задача.
    В целом подход такой же как в дереве на основе массива, нужен готовый список из минимального количества элементов, каждый элемент должен содержать признак пустой он или нет, получение элемента по индексу через обход элементов с начала. При разрастании дерева нужно добавлять сразу такое количество элементов, чтоб влазил весь следующий уровень дерева.
    Кстати, какой ЯП планируете использовать?
  • Как реализовать дерево на основе связного списка?

    @res2001
    Axretit, Можете использовать последовательный список так же как массив в комментарии Alexandroppolus https://qna.habr.com/q/1098806#clarification_1406260
    Но, конечно, работать будет мягко говоря не быстро, т.к. список не поддерживает индексацию, поэтому придется каждый раз обходить список для достижения нужного узла.
    Если это в учебных целях, то почему бы и нет, раз препод хочет.
  • Ошибка при загрузке attempted_write_to_readonly_memory?

    @res2001
    В интернетах по этой ошибке пишут следующие действия:
    1. Сделайте тест памяти.
    2. Обновите БИОС.
    3. Обновите драйвера.
  • Как подключить htmlcxx в проект C++?

    @res2001
    rastr,
    unresolved symbol

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

    @res2001
    Денис Фатеев,
    что надо сделать

    Просветите нас, как вы завершаете программу?
    Т.к. если будет eof в stdin, то должен сработать последний cout и вывести результат последнего подсчета.
    Видимо вы завершаете программу с помощью Ctrl+C, а это аварийно прерывает выполнение на текущей операции, а вы подобные исключительные ситуации никак не обрабатываете.
    Выхода 3:
    1. Завершать выполнение, используя ввод EOF: в винде Ctrl+Z, в никсах Ctrl+D
    2. Предусмотреть корректное завершение программы с помощью ввода какого-то значения, а так же, конечно, при достижении eof или ошибки cin.
    3. обрабатывать Ctrl+C. По моему, try/catch не ловит Ctrl+C, но могу ошибаться. В винде можно поставить собственный обработчик на подобное прерывание (с помощью Console API), а в никсах надо ловить соответствующие сигналы (POSIX API).
  • Почему arr и &arr отображаются одинаково?

    @res2001
    Артём,
    а сам же поинтер где-то должен хранится

    Вот как раз в этом и разница. Массив это почти как настоящий указатель, только память под указатель не выделяется и про реальный адрес знает только компилятор. Для удобства в некоторых случаях имя массива ведет себя как указатель, а в некоторых как массив. Возможно, это и не так удобно на самом деле и только вводит в заблуждение.
    Четвертый пример вообще сносит неподготовленную крышу и вроде как противоречит примерам выше :) Это результат натягивания массива на указатель.
    Адрес автоматического массива берется как смещение относительно указателя стека, так же как и адреса других автоматических переменных.
    В общем не стоит относится к массиву как к указателю. Нужно знать нюансы в поведении и использовать там где это необходимо. К слову в реальности не так уж часто приходится иметь дело со статическими/автоматическими массивами, гораздо чаще - с динамическими. И обычно, там где приходится работать со статическими/автоматическими массивами работа эта достаточно тривиальна, без вот этих ваших вывертов мозга :)

    Еще один пример подобного не совсем стандартного поведения это имя функции:
    void foo(void);
    ...
    if(foo == &foo)
       cout << "Это условие всегда срабатывает" << endl;
  • ДНС - адрес в IPv4, Что будет если его изменить?

    @res2001
    Данила Иванов, Проверить, что возвращает DNS у клиента можно просто выдав в консоли команду:
    nslookup network3.reach.group
    Команда должна вернуть IP адрес, назначеный этому имени.
    Дальше можно этот адрес пропинговать, это проверит доступность адреса.
    Но из-за разных проблем у провайдеров, хостеров, с настройками DNS серверов, промежуточного кэширования и т.п. IP адрес может возвращаться не правильный. Точно так же и пинг может не срабатывать, если на хосте (или где-то на промежуточном шлюзе) пинги заблокированы фаерволом. В общем эта проверка не дает 100% гарантии. Но кое-какую информацию может дать. Особенно, если проверку будет проводить админ хоста, а не просто посторонний, не владеющий дополнительной информацией.
    На счет замены IP адреса - не владея информацией о внутренней организации сети хоста (какие адреса доступны в пуле, какие ДНС имена зарегистрированы, где и какие ДНС серверы обслуживают зону где находится хост, как осуществляется доступ к серверу из интернет и т.д.) вообще нельзя ничего сказать. Обычно замена адреса (какого? на какой? где?) ни к чему не приведет, только сделает еще хуже, но могут быть варианты.
    Так что, да, админам видней. Не стоит лезть в их кухню. Если админы сами не сильны, то им следовало бы найти человека, который сделает им хорошо.
  • Как при переносе файлов NTFS назначать права конечной папки?

    @res2001
    2k21, Это не проблема, на самом деле.
    Это стандартное поведение винды: при переносе файлов права то же переносятся. При копировании - в новых файлах права наследуются от вышестоящей папки назначения.
    Из расширенных прав на самом деле нужно только право на "Смену разрешений". Если его убрать, то пользователи не смогут менять права файлов и они, наверное, будут наследоваться.
    Вообще никогда не ставте для пользователей "Полный доступ", достаточно манипулировать стандартным набором прав.
  • Как сделать переадресацию от клиента во внешнюю сеть(OpenVPN)?

    @res2001
    Не нужно делать "переадресацию портов". Нужно настраивать маршрутизацию и/или NAT и разрешить ВПН трафик в фаерволе.
  • Как настроить ssh туннель для smb?

    @res2001
    Serbli,
    Но так же необходимо чтоб 445 порт был свободен на этом сервере.

    Ключевая фраза. Когда на клиенте и сервере работает SMB, то этот порт занят виндой ВСЕГДА. И не только этот, но и 135,137,138,139 и их UDP братья. Следовательно SSH не сможет открыть эти порты для проброса!
    Так что забудьте. Вам нужен полноценный ВПН, который не SSH.

    Кстати, для SMB используются не только TCP порты, но и такие же UDP порты, а их SSH пробросить не сможет в любом случае.
  • Как исправить резкое повышение пинга в играх при частых действия?

    @res2001
    Данил Самусев, Не имеет значение широкополосный у тебя интернет или нет - скорость передачи данных фиксированная в любом случае. Именно этот факт играет роль, а технология - не важна.
    Кроме скорости это может зависеть и от производительности проца - чем большы ты его загружаешь, тем меньше остается ресурсов для фонового пинга.
  • Из-за чего программа на C выдаёт неправильный ответ?

    @res2001
    Anvario0, Можете попробовать логически доказать, что в задаче нет решения.
  • Из-за чего программа на C выдаёт неправильный ответ?

    @res2001
    Anvario0, Не обязательно.
    Сделайте в while выход при достижении a<12 (т.е. после переполнения), чтоб не было вечного цикла.
  • Как написать компаратор для std::find?

    @res2001
    но ловлю 3 ошибки

    Какие ошибки? Судя по коду компаратора ошибок быть не должно. Разве что сортировать может не правильно :)
  • Что значит открытый ключ сертификата подписанный закрытым ключом ЦС?

    @res2001
    SagePtr, Где в ссылке про хэш? Читаем ссылку:
    п.4.1.1.3 поле signatureValue (содержит подпись ЦА сертификата) "... поле tbsCertificate является входом для функции подписи...". Т.е. по сути подпись генерируется по полю tbsCertificate.
    п.4.1.1.1 поле tbsCertificate: "Поле содержит имена субъекта и эмитента, открытый ключ связанный с субъектом, срок действия и другую сопутствующую информацию. Поля подробно описаны в разделе 4.1.2"
    Если спуститься в п.4.1.2, то там можно увидеть расшифровку каждого поля, которое входит в tbsCertificate.

    По сути поле tbsCertificate - это и есть вся информация о владельце сертификата, которая содержится в сертификате и возможно пачка расширений. В общем ЦА ставит подпись на весь сертификат.

    Это можно понять просто посмотрев текст сертификата. Поля сертификата расположены в определенной иерархии. Все что в иерархии полей сертификата идет "внутри" поля "Signature Algorithm" подписывается ЦА. Сама подпись ниже на том же уровне.
    Использовал свои сертификаты, сгенерированные с помощью openssl.
  • Почему побайтовый сдвиг даёт разные результаты?

    @res2001
    Евгений Шатунов, В С++20 убрали все рассуждения о знаковом/беззнаковом типе, за исключением UB, когда правый операнд отрицательный . Я так понимаю, что теперь левый сдвиг будет выполняться как для беззнаковых типов, затем битовый результат сдвига интерпретируется в результирующий тип.
    Интересно, реально компиляторы как-то меняли свое поведение при сдвигах от стандарта к стандарту. Что-то мне кажется, что нет. В стандартах формулировки потихоньку подгоняли под реальное положение дел. Пожалуй в С++20 формулировка стала наиболее адекватной.
  • Почему побайтовый сдвиг даёт разные результаты?

    @res2001
    Евгений Шатунов, Спасибо за ссылки. В стандартах в общем то все +-одинаково. В С++20 изменили формулировку, но смысл, по моему тот же самый, даже несколько упростили, что странно :)
    Прочитал статью, там UB только при использовании отрицательных значений.
    Таким образом, в нашем примере сдвиг влево это не UB, но его результат будет отрицательным, и тогда уже UB - это следующий сдвиг вправо. Хотя тут в ассемблере - "арифметический сдвиг" с вполне понятным результатом для отрицательных чисел. Но с точки зрения стандартов С++ все сдвиги с отрицательными операндами UB.
  • Есть ли разница для шифрования UTF-8 строк и ASCII строк через SHA-1?

    @res2001
    HamsterGamer, UTF8 так же как и все остальное можно и в обычном массиве charов хранить.
    На счет кодировок - в той же винде есть встроенная WinAPI функция, которая все вам перекодирует куда надо, главное задать правильно исходную кодировку и кодировку назначения.
    Для того, что бы точно знать какая у вас в программе используется кодировка для строковых литералов, нужно просто сохранить сами исходники в этой кодировке, а литерал объявлять без всяких префиксов, ну т.е. просто так: char *str = "Привет мир!";.
    В С++20 добавились новые типы char для разных вариантов utf8, можно было и их использовать.