Задать вопрос
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @res2001
    floppa322, Не знаю, почему бы и нет.
    Но даже, если этого не произойдет, то в случае обычного оператора присваивания сам оператор должен будет перед присваиванием выполнить действия аналогичные действиям деструктора (да еще будет дополнительно вызван деструктор временного объекта), а в случае присваивания перемещением просто вызовется деструктор временного объекта (в этом случае будет лишнее перемещение данных оригинального объекта во временный).
    Все говорит за то что явный вызов деструктора и размещающего new проще для понимания и эффективней.

    placement new - это замаскированный вызов конструктора на заданном участке памяти.
    Т.е. если расписать содержимое placement new, то будет что-то вроде:
    (reinterpret_cast<T *>(buffer))->T(args);
    В С++ явный вызов конструктора (как метод класса) запрещен, но в MSVS такое когда-то прокатывало и можно было обходится без placement new, как сейчас - не знаю.
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

    @res2001
    Не знаю, на счет "хорошоей практики".
    Компилятор наверняка тут включит свои оптимизации и получится примерно одно и то же в обоих вариантах.
    Но вариант с оператором присваивания накладывает на объект дополнительные ограничения - у объекта должен быть реализован оператор присваивания, а лучше чтоб был оператор присваивания перемещением.

    Лично мне больше нравится вариант с явным вызовом деструктора и размещающего new, именно по тому, что тут все явно. Явное всегда лучше не явного.
  • Зависает намертво или дико начинает тормозит Ubuntu 20.04, как лечить?

    @res2001
    Немного другая ситуация - после выхода из скринсейвера после продолжительного времени не активности начинает дико лагать вплоть до полного коматоза. Если скринсейвер включается на краткое время, то восстанавливается без проблем. Скринсейвер дефолтный - blank screen.
    Пока руки не доходят посмотреть в логах, что происходит, но методом тыка обнаружил, что виноват firefox.
    Если его закрываю перед блокировкой, то просыпается нормально.
  • Чему учит Марк Лутц?

    @res2001
    Луца читал в свое время. Толковый учебник по питону.
    На сколько помню, он там ничего не пишет про сетевое взаимодействие и не описывает соответствующих модулей. Так что может конкретно Луц и не поможет в написании сетевых игр.
    Для этого стоит читать других авторов, возможно, не связанных с питоном (сетевое программирование оно +- на всех языках одинаково). Как и по многим другим более специализированным темам.

    Возможно ТС уже перешагнул уровень учебника и стоит посоветовать что-то более углубленное.
    От себя могу посоветовать изучить следующие направления программирования: сетевое программирование, базы данных и SQL, параллельное программирование. Каждая из этих тем тянет на большую и толстую книгу, а то и не на одну. И это только начало :)

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

    @res2001
    Я бы загнал первый массив в std::unordered_map, где ключ - это значение очередного элемента первого массива, а значение - счетчик. Для всех элементов первого массива, счетчик выставляем в 1.
    Дальше ищем каждое значение второго и третьего массива в mapе, если найдено - инкрементируем счетчик.
    Выводим все элементы из mapы, у которых счетчик равен 3.

    Стоит выбрать самый наименьший по размеру массив и его брать как первый.
  • Когда narrowing conversion Не является implementation defined?

    @res2001
    floppa322, Да, только убедится в этом вам нужно явно в коде.
  • Когда narrowing conversion Не является implementation defined?

    @res2001
    По моему, в приведенном примере это всегда зависит от реалиации, т.к. компилятор не генерирует проверяющий код.
    В приведенном примере длины типов равны, занчит будет просто побитовое копирование. Если бы длины типов были разные, то wide type обрезался до длины narrow type и то же самое побитовое копирование.
    Если включен высокий уровень предупреждений, то в этом месте компилятор ругнется.

    В приведенном примере, если значение uint32 >= 0x80000000, то в результате в int32 будет отрицательное число.
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    @res2001
    mercower26,
    в Си не обязательны фигурные скобки в цикле

    Не обязательны. Но тогда в теле цикла будет выполнятся только 1 следующая после for операция, а у вас это flag=0;
    Это явно не то что нужно. flag должен обнулятся в начале каждой итерации первого цикла. В эту же итерацию должен входить и второй for, а он у вас сейчас не является вложенным в первый for (то что отступами второй for сдвинут относительно первого никакой роли не играет, в С/С++ отступы выполняют декоративную функцию, чисто для удобства разработчиков, компилятору на них наплевать).
    Вообще не стоит экономить на скобках и разметке - они делают код более понятным вам же (и тем кто читает ваш код).
    printf("Результат %d\n",X);
    Что вы хотите тут получить? Тут вы выводите адрес массива Х, а не содержимое. Печать элементов массива надо делать так как приведено в вашем же скриншоте выше.
  • Почему программа на СИ молчит?

    @res2001
    Логические операции то же судя по всему не проходили, или вы никогда в глаза не видел ASCII таблицу - всю эту портянку ifов можно заменить одним с условием
    if(a[i] >= '0' && a[i] <= '9') {
          num[i] = a[i];
          check = 1;
          continue;
     }


    w = atoi(num); на первой итерации num не инициализирован, в нем содержится мусор и этот мусор мы зачем то конвертируем в число. Вообще w используется только в блоке else, может быть туда и надо сунуть эту конструкцию?

    Вообще я бы пошел другим путем:
    1. В вашем цикле for:
    1.1. пропускаем не цифровые символы. Это делается просто вложенным циклом с проверкой и инкрементом счетчика. Все не цифровые символы сразу же копируем в итоговую строку. Если вам не нужна итоговая строка, можно просто каждый символ выводить сразу на экран.
    1.2. Найдя первую цифру, в следующем вложенном цикле "по цифрам" определяем максимальную цифру, для определения системы счисления. При проходе, не теряем индекс первой цифры, он понадобится в следующем пункте.
    1.3. Конвертируем число с помощью функции strtol, она поддерживает работу с разными системами счисления.
    1.4. Проверяем, что бы конвертированное число было меньше 256 (иначе число - это символ не из однобайтовой кодировки, а что-то из Unicode, а это вы тем более не проходили).
    1.4.1. Если число меньше 256, то записываем код числа как следующий символ в итоговую строку, или выводим на экран символ соответствующий коду.
    1.4.2. Если число >=256 - печатаем ошибку и завершаемся.
    1.5. переходим к следующей итерации основного цикла
    2. Выводим получившуюся выходную строку

    Во всех вложенных циклах не забываем контролировать на превышение длины входной строки.
    Входная и выходная строки - это разные строки, так проще. Или же сразу выводите на экран каждый символ выходной строки по отдельности. Можно, конечно, все делать "на месте" (корректировать входную строку), но код будет гораздо сложнее, чувствую, что вам пока рано это. Можете отработать алгоритм на двух строках, а потом, если захотите, реализовать вариант "на месте".
  • Как разделить xml файл спомощью bat/cmd?

    @res2001
    wisgest, Спасибо за разъяснения. Не знал, что можно кроме точки использовать что-то другое и в своей практике ни когда не сталкивался с проблеммами использования echo. Это, конечно, не исключает проявления этих проблем в дальнейшем.
  • Как разделить xml файл спомощью bat/cmd?

    @res2001
    Мой ответ не верный. В батниках вполне реально работать с xml, что доказал в своем ответе wisgest
  • Как разделить xml файл спомощью bat/cmd?

    @res2001
    Работает!

    Кстати, в последнем echo явно не хватает закрывающей скобки. Но оно и так работает... Странно
    Добавил скобку перед перенаправлением вывода - работает, но не правильно.
    Привел к такому виду: (echo.%%L)>>!i!.xml. Работает правильно и все скобки на месте.

    Поэкспериментировал еще со служебными символами, содержащимися в переменных.
    Оказалось, что вполне можно работать с ними, только надо везде использовать восклицательные знаки для обращения к переменным. Тогда они не раскрываются в командной строке, это происходит где-то потом. Соответственно ошибок не возникает даже вне тела цикла. Ну и конечно нужно включать setlocal enabledelayedexpansion.
    Что характерно, переменные цикла раскрываются в коммандную строку, но это не генерирует ошибки. Об этом вы писали в нашей прошлой дискуссии по этому поводу. Видимо этот момент как-то особенно обрабатывается в cmd.

    Жаль, что не знал обо всем этом лет 10 назад :)
    Свою позицию по работе со служебными символами, содержащимися в переменных, в батниках окончательно меняю.
    Мой ответ не правильный.
  • Для чего нужен возврат значения по ссылке?

    @res2001
    Владимир Коршунов, int& b = func(a);
    b - ссылка.
    Ссылка это не указатель!
    Если копнуть в ассемблер, то ссылки - это те же указатели (т.к. ни каких ссылок в ассемблере нет), но на уровне С++ ссылка это не указатель.

    Используют ссылки и указатели для одного и того же, но, как было верно замечено, ссылки почти всегда указывают на конкретный объект, тогда как указатели запросто могут иметь произвольное значение, не указывающее на объект, или nullptr.
    Ссылка может быть битой в случае многопоточного приложения, когда один поток получает ссылку на существующий объект, а второй поток потом этот объект уничтожает.

    Если взять адрес от ссылки, то получите адрес объекта. Если же взять адрес от указателя, получите адрес указателя, а не объекта на который он указывает.

    На счет разъименования - эта операция нужна для указателей, т.к. вы можете работать либо с самим указателем, либо с объектом на который указывает указатель (тут и нужно разъименование).
    С самой ссылкой вы ничего дополнительно сделать не можете. Вы можете только создать ее и уничтожить (при выходе из области видимости). Все остальные операции с участием ссылки происходят реально над объектом, на который ссылается ссылка, поэтому нужды в разъименовании нет.

    https://ideone.com/jQK0u1
  • В чем ошибка в написанном коде, в 5 строке?

    @res2001
    pfemidi, Сори, ошибся. Сообщение, конечно, предназначено автору. Исправлюсь.
  • Почему DNS запись на mikrotik не видит узел?

    @res2001
    ViktorGuerro, В ДНСе А записи всегда находятся в какой-то зоне (домене). Если у вас правильно указан ДНС сервер на клиентах, то просто исопльзуйте полное доменное имя, т.е. base.<имя домена/зоны>

    Если сильно хочется использовать именно короткое имя, то домен нужно прописать в настройках domain suffix. Эта настройка в винде есть где-то в глубине сетевых настроек. В таком случае винда сама будет подставлять доменный суффикс к именам.
  • В чем ошибка в написанном коде, в 5 строке?

    @res2001
    mercower26,
    а вывод идёт ну явно в UTF-8

    Видимо исходники написаны в UTF8. Сам компилятор ничего не перекодирует - в какой кодировке у вас написаны строковые литералы, то и выводится в консоль. Вывод будет правильный, только если кодировки консоли и исходников совпадают, либо если вы в коде будете перекодировать текст перед выводом в консоль.

    В русской винде для консоли есть несколько вариантов кодовых страниц, причем по умолчанию используется внезапно CP866. Кодировку в консоли можно в любой момент изменить консольной командой (chcp /?).
  • В чем смысл определения const int &ref=1;?

    @res2001
    Попробуйте собрать код, содержащий такое.
    Собралось?
    У меня не собралось.
    А вот такое
    const int &ref = 1;
    // или
    int &&ref = 1;

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

    @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
    Но, конечно, работать будет мягко говоря не быстро, т.к. список не поддерживает индексацию, поэтому придется каждый раз обходить список для достижения нужного узла.
    Если это в учебных целях, то почему бы и нет, раз препод хочет.