• В чем разница между delete и nullptr?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    g = nullptr не удалаят память, оно просто записывает в переменную g значение со смыслом - "указатель вникуда". Память при этом остается нетронутой и к ней можно обращаться, что вы и делаете, запомнив указатель в другой переменной.

    delete[] же освобождает память, а значит, все последующие обращения к ней, что при помощи g, что при помощи gg - будут вызывать UB
    Ответ написан
    Комментировать
  • Как правильно выделить память (с проверкой выделения) для массива класса?

    @res2001
    Developer, ex-admin
    какой из вариантов наиболее эффективен / наиболее используемый

    Создание класса в динамической памяти делится на 2 этапа:
    1. выделение "сырой" памяти у менеджера памяти
    2. инициализация памяти - вызов конструктора класса на выделенном участке памяти.
    Вариант с malloc не выполняет вторую часть. Для того что бы закончить процесс в этом варианте вам надо использовать размещающий new, передав указатель на ранее выделенную память. Деструкторы так же нужно будет вызывать явно.

    Если вариант с malloc довести до логического конца, то он будет делать то же самое что и вариант с new, никаких преимуществ тут нет. Но не забываем про явный вызов деструктора.

    При удалении класса из динамической памяти присутствуют обратные этапы: вызов деструктора и освобождение памяти.

    malloc обычно используют в плюсовом коде, когда реализуют собственные аллокаторы и нужен "сырой" не инициализированный блок памяти. Но и в этом случае вполне можно обойтись без malloc - использовать new char[MEM_SIZE]
    Ответ написан
    Комментировать
  • Как найти точки пересечения 2х фигур с++?

    Adamos
    @Adamos
    Я не могу найти точки пересечения прямоугольника и окружности

    Беда. Может, поискать - в поисковике?
    Ответ написан
    3 комментария
  • Как правильно выделять сырую память для размещения в ней объектов?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Нет, если вы не вызвали конструктор и обратились к объекту, вы схлопочете UB, формально говоря.
    Да и какой смысл в том, чтобы навыделять памяти, а конструкторы не вызывать? Это нарушает принцип RAII как минимум.
    Кстати, именно статической памяти я в вашем коде не увидел.

    Так что со стороны это все выглядит как проблема X-Y.
    Ответ написан
    8 комментариев
  • В разных IDE код выдаёт разный ответ, как так?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Оператор << не является точкой следования, таким образом, вы получаете неопределенное поведение - у вас вызовы ++(*val) не отделены точкой следования друг от друга.

    Вот так ошибки не будет:

    cout << a.get();
    cout << b.get();


    Потому что ; является точкой следования.

    В более свежих версиях стандарта может быть другая терминология, но суть проблемы - прежняя.
    Ответ написан
    Комментировать
  • Почему не находится определение при линковке объектников ассемблера и c++?

    @galaxy
    Попробуйте extern "C" int _sub(int, int);
    Ответ написан
    Комментировать
  • Как организовать работу одного радиопередатчка и нескольких приемников?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    В условиях небольшого помещения сеть из ESP8266 на вайфае - первый выбор, оставляющий далеко позади блютус (маленький радиус стабильной работы) и уж тем более радиомодули на безлицензионных диапазонах (на автора этой идеи я бы хотел так сказать, посмотреть - с легкой руки усложнить задачу на два порядка - это надо уметь!)

    Также не нужны разного рода ModBus over TCP - потому что это лишний слой абстракции поверх уже имеющейся в IP адресации.

    Фактически, вам нужно просто слушать сокет, выполнять команды и отвечать на пинги.
    Ответ написан
    Комментировать
  • Почему 0.2f + 0.3f == 0.5f?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    0.2 = 1.100110011001100110011012 * 2-3
    0.3 = 1.001100110011001100110102 * 2-2
    Приводим к старшей степени, сохраняя количество двоичных разрядов.
    0.2 = 0.110011001100110011001102 * 2-2
    Складываем, получаем
    0.110011001100110011001102 * 2-2
    +
    1.001100110011001100110102 * 2-2
    =
    10.00000000000000000000002 * 2-2
    = 1.0000000000000000000002 * 2-1 = 0.5
    Ответ написан
    Комментировать
  • Как получить id потока в процессе C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно получить список всех потоков одного процесса через Thread32First/Thread32Next (пример).

    Ищется в гугле буквально по "winapi list threads".
    Ответ написан
    Комментировать
  • Почему std::endl не требует круглых скобок?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Да, это реально так. Более того, при желании, можно написать свое такое же - например, как в моем миниатюрном классе логов:
    Lout& operator << (Lout& out, Lout& (*func)(Lout&));
    Lout& operator << (Lout& out, std::function<Lout& (Lout&)>&&func);
    
    //stream commands & modifiers
    Lout &anounce(Lout &ret);
    Lout &flush(Lout& out);
    Lout &ok(Lout& out);
    Lout &fail(Lout& out);
    Lout &newLine(Lout& out);
    Lout &pop(Lout& out);
    Lout &Color(Lout& out, const uint8_t);
    Lout &noColor(Lout& out);
    Ответ написан
    Комментировать
  • Существует ли такой анализатор кода?

    Viktor_T2
    @Viktor_T2
    python developer
    Комментировать
  • Почему не воспроизводится звук?

    @rPman
    Потому что эта функция не умеет играть .mp3 файлы, только waveform audio, при наличии соответствующего драйвера, поддерживаются кодеки (например ac3 или даже mp3, по крайней мере я смутно помню свои эксперименты с этим еще в winxp), но формат файла должен быть все равно riff (т.е. wav или avi, кстати последний под вопросом, сможет ли он выцепить от туда звуковую дорожку, хз)
    https://docs.microsoft.com/en-us/previous-versions...
    The sound specified by pszSound must fit into available physical memory and be playable by an installed waveform-audio device driver.
    Ответ написан
    Комментировать
  • Лагает фотошоп, премьер про на мощном пк, как убрать лаги?

    sugarraisin
    @sugarraisin Автор вопроса
    И так, пораскинув мозгами, понял, что такое началось, после покупки материнской платы AsRock PRO4 z390.
    Пошерстив сайты, форумы, много советов было про отключение "энергосбережения в биос". Это в разделе «Расширенное», дальше в конфигурации ЦП, там типо как-то с буквой «С» все режимы выключите. Отключил то, что нашел и знаете, ощущается работа системы бодрее, но все еще не идеально. Уверен, еще пару пунктов в биосе этой материнки я не отключил. Но улучшения заметны, серьезно. Безумно благодарен каждому, кто уделил время ответив в этой теме ( или топике ), с попыткой помочь мне, безумно приятно, что хороших людей еще много. Так же, буду благодарен, если подскажете, как окончательно отключить эти "кастрационные" фишки
    Ответ написан
    Комментировать
  • Как можно использовать union в качестве ключа unordered_map?

    includedlibrary
    @includedlibrary
    Вам нужно использовать структуру из двух значений типа short. Для неё уже нужно будет определить вычисления хэш-функции, например так:
    struct MyStruct {
        unsigned short x;
        unsigned short y;
    };
    
    template<>
    struct std::hash<MyStruct> {
        std::size_t operator()(MyStruct const& s) const noexcept {
            return ((size_t)s.x << 16) | s.y;
        }
    };
    Ответ написан
    4 комментария
  • Есть ли разница для шифрования UTF-8 строк и ASCII строк через SHA-1?

    Adamos
    @Adamos
    В UTF-8, UTF-16LE и UTF-16BE символ кириллицы занимает два байта.
    Но в каждом из этих случаев это будут два РАЗНЫЕ байта.
    Соответственно, алгоритм, работающий с байтами, выдаст РАЗНЫЙ хэш.
    Вам, если вы не хотите разложить себе на дороге грабель, лучше приводить свою информацию к байтам самостоятельно, а не полагаться на какие бы то ни было "волшебные" библиотеки.
    Ответ написан
    2 комментария
  • Как правильно построить многоугольник по точкам?

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

    Проверить, что что-то не так можно через векторное произведение последовательных сторон.

    Для всех 3 подряд идущих вершин a, b и c, то надо проверить, что (b-a)*(c-b) всегда дает одинаковый знак (или всегда <=0 или всегда >=0). Это векторное произведение.
    Формула в вашем случае будет (xb-xa)*(yc-yb)-(xc-xb)*(yb-ya).

    Еще можно построить выпуклую оболочку (convex hull).
    Вот расписан алгоритм, как ее построить по заданным точкам: https://e-maxx.ru/algo/convex_hull_graham

    Edit: Еще можно, вместо сортировки точек в выпуклую оболочку, игнорировать клики от пользователя, которые делают текущий многоугольник невыпуклым. Опять же, проверку невыпуколсти можно делать только для новых сторон: В последней, новой и первой точках.
    Ответ написан
    2 комментария
  • Почему побайтовый сдвиг даёт разные результаты?

    @res2001
    Developer, ex-admin
    Читайте тут до прояснения раздел "Bitwise shift operator.
    Смысл в том, что если вы знаковое число сдвинули влево так, что старшим разрядом стала 1, то в результате получится отрицательное число. При сдвиге вправо знакового числа, освобождающиеся слева разряды заполняются битом знака (а не нулем), поэтому результат сдвига отрицательного числа так же будет отрицательным (а положительного - положительным:). Если сдвигать вправо беззнаковое число, то свободные биты будут всегда заполнятся нулями.
    Кстати, на сколько помню, по стандарту знаковость char не определена (может быть как знаковым так и беззнаковым). Вам с вашим примером не повезло, char оказался знаковым. Зато это дало возможность немного глубже понять сдвиги.
    Ответ написан
    6 комментариев
  • Как настроить сборку для линковки двух разных версий одной библиотеки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Автоматический метод могу предложить только один: перезагрузите компьютер. Если не помогло, то придется искать ошибку в коде.
    Ответ написан
    8 комментариев
  • Какая IDE удобнее и проще для плюсов?

    @majstar_Zubr
    C++, C#, gamedev
    Это очень не умно, спрашивать у других о том, что для самого себя проще и удобнее. Особенно критично это для плюсов. Вот из чего я исхожу.

    C++ - свободный язык, если вы хотите произвести на свет новую платформу, и при этом хотите, чтобы уже написанные 100500 программных продуктов на нем работали, вы просто производите свой компилятор для C++. С Ide ситуация схожая.

    Что-то уровня десятков тысяч строк, комфортно можно написать в любой IDE. Но когда размер становится больше, или нужно использовать какой-то специфический пайплан разработки, только тогда становится понятно, зачем yet another IDE.

    На самом деле, все зависит от количества составляющих программного проекта, и как это все дело собирается.

    Qt Creator создана для удобства работы с Qt, особенно с точки зрения скрытия сложности сборки. Например, для VS лишь относительно недавно они родили на свет приемлемый плагин, который не заставляет добавлять файлы meta object compiler для каждой сборки проекта вручную. Но всё ещё осталось, мягко говоря, все остальное: WYSIWYG редакторы для файлов ресурсов, которые не всегда корректно работают, редактор для быстрого формошлёпства, удобная работа со старыми версиями qt, производительности плагина, и прочее и прочее. С qt работать из других qt стоит лишь тогда, если ваша система сборки не будет меняться чаще раза в N лет, иначе лишние траты на перенастройку сборки.

    Если что-то коммерческое собирается для Windows не на MSBuild + VC++, то могу пожелать счастливой отладки и напомнить, что спасение утопающих - дело рук самих утопающих.

    Eclipse нужен в случаях когда нельзя применять коммерческое ПО в ходе разработки. Или, если вы пишете про специфичную или открытую платформу, потому что как правило, в таких случаях владельцы платформы IDE не предоставляют по ряду причин. Тут на помощь приходит всемирно известный конструктор для IDE - Eclipse. Ещё его можно рассматривать в случаях, когда вы оптимизируете процесс разработки для себя. Хотя, этим заниматься лучше всего на Vim, Emacs. Насчёт последних - если кодовая база за миллионы строк, что выбора может не быть, но скорее всего, большинства а разработчиков эта проблема не касается.

    CLion нужен для тех, кто привык к другим IDEшкам от jetbrains. Хорошие, удобные, потому что коммерческие, постоянное развитие. На stepik можно решить тяжёлые задачи и получить лицензию на несколько месяцев, персональную. Хотя многие рефакторинги ещё не работают.

    Из ide ещё упоминают netbeans, а также многие редакторы, типа gedit, vs cide, geany и прочие.

    Если опыта разработки нет, то нужно начинать с geany. Потом переходить, например, на vs code. А уже потом пытаться что-то делать в IDE и делать проекты для сборки на разных платформах, например, с помощью cmake. Дело в том, что нужно знать, что делает при каждом чихе IDE, и самый органичный способ это сделать - наращивать сложность пайплацна разработки постепенно: сначала проекты на сотни строк, потом добавляем статический анализ, автоформатирование, тесты, git, управление сборкой и CI/CD. К тому же, это коррелирует с основным принципом C++ - "я не плачу, за то, что не использую", т.е. время на лишнюю возню из-за узкой специализации IDE, либо недостаточной специализации - оно не тратится. Именно исходя из этого, Евгений Шатунов вас спросил о вашей задаче, чтобы посоветовать что-то дельное.
    Ответ написан
    Комментировать
  • В чём суть шутки про ноги в С/С++?

    saboteur_kiev
    @saboteur_kiev Куратор тега C++
    software engineer
    Давным давно, на диком западе пользовались не очень безопасными револьверами. Нормального предохранителя не было, заряжать револьвер - слишком долго. Поэтому ковбои часто могли ходить с заряженными револьверами. А там было несложно неудачно дернуться, и собственно выстрелить себе в ногу.

    Любой инструмент, которым нужно пользоваться аккуратно, может привести к тому, что процесс упадет, возможно даже поломав другие процессы вплоть до синего экрана, то есть "выстрелишь себе в ногу".
    А с/с++ достаточно низкоуровневый язык, в котором нужно о многом думать.
    Забыл выделить память под переменную - выстрелил в ногу. Забыл освободить память - утечка накопилась - выстрелил в ногу. Перепутал указатель с указателем на указатель - ...

    В более современных языках работать проще, многое за тебя уже продумано и автоматизировано (garbage collector, например)
    Ответ написан
    Комментировать