Ответы пользователя по тегу C++
  • Какую IDE выбрать для С++ под Linux?

    TrueBers
    @TrueBers
    Гуглю за еду
    Clion для начала вполне годный. Со сложными исходниками и последними стандартами у него беда, конечно. Глючит порядочно, но постоянно что-то фиксят. Был бы бесплатный, ещё ладно. Но платить за это поделие желания нет. Если у вас меньше 4-х ядер и 8-ми гигабайт, можете даже не пробовать, будет жутко бесить тормозами. Хотя, в последних EAP довольно неплохо улучшили отзывчивость в нагрузке. Раньше даже печатать было невозможно, пока он там шуршит.

    Есть ещё простенькая IDE — juci++. Но она пока что в активной разработке и очень спартанская, мало чего умеет, но не тупит и очень неплохо автодополняет.

    VSCode от майкросовта занудная штука. Вроде, сначала всё работает, а стоит подключить какой-нибудь boost и привет, шаблонную магию не переваривает. Может дополнить пару неймспейсов, а дальше в упор не видит ничего.

    QtCreator до сих пор не научился HiDPI. У меня на обоих девайсах dpi достаточно высокий, всё выглядит как пережатый 50 раз jpeg. Может быть, если у вас обычный монитор, то будет нормально.

    Если есть желание позамарачиваться, можете освоить vim. Для него есть неплохой плагин YouCompleteMe. Но там всё надо тюнить, крутить 50 тысяч параметров. Но настроив под себя, довольно удобно получается, хотя, мало кто это осиливает.
    Ответ написан
    Комментировать
  • Как поймать ошибку в visual studio?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вот к примеру
    char ch = str[5];
    длина str всего 3. Поэтому возникает ошибка, но vs не вылетает

    Оно и не должно вылетать. Выход за пределы массива это неопределённое поведение. Компилятор вправе делать что угодно при неопределённом поведении, хоть систему вам форматировать, хоть пойти закурить. Он не обязан выкидывать исключение. Контроль этого только на вашей ответственности. Либо используйте статический анализатор, он вам покажет, что вы не так делаете.

    А ещё лучше, для строк используйте специально созданный для этого контейнер std::string, для статических массивов — std::array, для динамических — std::vector. И ничего не будет вылетать.
    Ответ написан
    2 комментария
  • Как сделать наследование класса со структурой?

    TrueBers
    @TrueBers
    Гуглю за еду
    У вас в корне неверное понимание наследования и каша в голове.

    Наследование — это выражение отношения является. Т. е., по-вашему, книга является множеством авторов. Абсурд ведь, разве нет?
    Книга — это книга, она может являться бумагой, или абстрактным объектом, или содержимым библиотеки, но никак не авторами. Она написана авторами, авторы — это её аттрибут. Поэтому здесь лучше использовать агрегирование, а не наследование. Ибо книга содержит, в какой-то мере, творчество множества авторов.

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Если у вас С++, а не чистый Си, то конечно используют std::vector. А вместо char[] используют std::string.
    Если Си, то придётся выделять динамически через malloc.
    Ответ написан
    9 комментариев
  • Как узнать время выполнения сортировки в C++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Mercury13 и fshp ответили верно.
    С одним лишь исключением: std::chrono::high_resolution_clock — не монотонные часы. Т. е. они могут дрифтить даже относительно RTC, а этот дрифт будет корректироваться и влиять на результаты измерений. Например, когда вы будете делать измерения, и между стартом и стопом к вам прилетит синхронизация NTP.

    Использовать нужно монотонные часы, для этого предназначены std::chrono::steady_clock. Они независимы от изменений и специально предназначены для измерений интервалов.
    Ответ написан
    6 комментариев
  • Почему нет C++17?

    TrueBers
    @TrueBers
    Гуглю за еду
    Потому что скриншот маркетинговый. С++17 ещё не принят окончательно. Т. е. его ещё не существует как такового в виде релиза, хоть и изменений вноситься уже не будет. А даже когда примут, пройдёт миллион лет, как студия начнёт его поддерживать. Ставьте latest и не парьтесь.
    Ответ написан
    3 комментария
  • Как слушать Stomp через WebSocket на C++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Попробуйте погуглить, вам понравится!

    У апачевского рантайма, как минимум, есть библиотеки, как плюсовая, так и чисто сишная.
    Ответ написан
  • Почему не получается создать сокет?

    TrueBers
    @TrueBers
    Гуглю за еду
    int iFamily = AF_UNSPEC;
     
    saLocal.sin_family = (ADDRESS_FAMILY)iFamily;

    Как вы собираетесь создать сокет с неопределённым типом? Он должен быть в вашем случае либо AF_INET, либо AF_INET6.

    А насчёт WSAEACCESS вы читали MSDN? Там же даже табличка есть, с объяснениями ошибок и в каких случаях они появляются, и внизу указано:
    Note A socket that is using the SO_EXCLUSIVEADDRUSE option must be shut down properly prior to closing it. Failure to do so can cause a denial of service attack if the associated service needs to restart.

    Ещё советую почитать про TCP вообще. Про его конечный автомат, какие у него бывают состояния, что такое полу-закрытый сокет, что такое graceful shutdown, и т. п.

    Когда вы используете SO_EXCLUSIVEADDRUSE, у вас не должно быть повисших соединений в любом из состояний. Т. е. не только ESTABLISHED, но и различных FIN-WAIT, TIME-WAIT, CLOSE-WAIT тоже быть не должно. Если вы биндитесь на один и тот же порт всегда, то использовать SO_EXCLUSIVEADDRUSE на клиентах будет очень проблематично, ибо всегда будете нарываться на полу-закрытый порт.
    Ответ написан
    3 комментария
  • Как перенаправить любое TCP-соединение на прокси?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ответ написан
    Комментировать
  • Как работает генератор случайных чисел?

    TrueBers
    @TrueBers
    Гуглю за еду
    rand()в C++ является уязвимым и будет удалён из стандарта.
    Сейчас рекомендуется пользоваться реализацией алгоритма Mersenne Twister
    Ответ написан
    Комментировать
  • Как запустить обработчик для UDP соединения?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ну, так, а вы почитайте про разницу UDP и TCP и всё станет понятно.

    В UDP нет понятия подключения или потока байт. Там есть понятия датаграмм. Это атомарные сущности, которые принимаются точно так же, как и отсылаются, абсолютно в том же виде.

    Каналы в джаве созданы просто для унификации, для некого подобия псевдо-стримминга для удобной обработки. На самом же деле, никакого канала и потока нет. Есть отдельные датаграммы определённого размера, которые вы должны принимать.
    Каждый клиент идентифицируется по его паре адрес:порт, с которого пришли данные через функцию recvfrom. Других вариантов нет.

    Это, если нужна синхронная обработка. Для асинхронного варианта, как уже ответил dummyman, удобнее использовать Asio.
    Ответ написан
    Комментировать
  • Создание вектор массивов C++? И как добавлять туда данные?

    TrueBers
    @TrueBers
    Гуглю за еду
    Какие массивы, какие элементы? Что вам скажет ваш код через год-другой, когда вы увидите массив из шести "чего-то"?
    Почему бы не объявить обычную структуру вида
    struct Point { // понятно, что это координаты точки, а не абстрактные буквы в вакууме
      double x, y;
    };

    и дальше для каждой группы создать тоже структуру
    // имена, конечно, надо заменить на что-то, имеющее отношение к вашей задаче
    struct Bundle { // здесь понятно, что это какая-то композиция из трёх точек
      Point p1, p2, p3;
    };

    ну, и вектор этих структур
    std::vector<Bundle> v; // а здесь — вектор из этих композиций из трёх точек
    // добавляем
    v.emplace_back(Bundle{{ 0.0,  0.1},
                          {0.15, 0.05},
                          { 1.0,  0.5}});
    Ответ написан
    Комментировать
  • Как получить свой внешний id адрес с помощью публичных stun-серверов и c++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Stun серверы предназначены не для получения IP-адреса.

    Они нужны для того, чтобы проверить тип вашего NAT'а и применить соответствующий этому типу метод Interactive Connectivity Establishment, так называемое пробитие портов.

    Ваш публичный адрес можно получить через миллион публичных сервисов API. Например, ipinfo.

    А если вам, внезапно, всё же для чего-то нужен STUN, в чём я сомневаюсь, то описание, что и куда слать, есть в его RFC.
    Ответ написан
  • Какой компилятор выбрать для C++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Самый древний и популярный компилятор — это GCC. Он поддерживает миллиард платформ, хорошо фичи новых стандартов умеет, стабильный, быстрый. Классика, работающая всегда и везде. Версия для винды ставится либо из Mingw-w64, он довольно прилично отстаёт от основной ветки, но работает неплохо. Либо можно поставить из пакета MSYS2, там всё свежее и постоянно обновляется.

    Visual Studio — если вы начнёте с неё, то потом будет очень тяжело перейти на другой компилятор, всё будет непривычно и ничего не будет работать. Ибо вижуал студия подразумевает тесную интеграцию IDE и компилятора. Ко всему прочему, если вы пишете код в вижуал студии и он компилируется, это ещё не значит, что код соответствует стандартам, и будет компилироваться где-либо ещё. Так как майкрософты, по классике, клали большой и толстый на все эти ваши стандарты. Да, IDE у них более-менее юзабельная, но у компилятора своя атмосфера.

    Ну, и самый, на мой взгляд, прогрессивный и удобный компилятор — clang. Очень молодой, но очень фичастый. Очень удобные сообщения об ошибках, всё понятно и наглядно. Поддерживает даже черновики и пропозалы новейших стандартов. Для новичка, более чем, рекомендую! Поставить его для винды можно всё из того же пакета MSYS2. Можно, конечно, качать сборку с официального сайта, но она не всё поддерживает в винде. Ещё есть вариант поставить clang вместе с Visual Studio 2017 Community. Там есть такая фича, не пробовал, правда, но в теории, должно работать.

    В качестве IDE ещё могу посоветовать Clion. Крутая штука, хоть и тормознутая малость. Из мелких и легковесных — juci. Очень шустрая современная штука, правда, пока не особо чего умеет.

    Так же, для обучения сразу включайте все ворнинги, все ошибки, отключайте расширения компиляторов. Ибо привыкните к ним, а потом поймёте, что это не стандарт и будет очень непривычно.
    Ответ написан
    Комментировать
  • Что использовать для автоматической генерации диаграмм состояний UML?

    TrueBers
    @TrueBers
    Гуглю за еду
    Современные C++11, 14, 17 не поддерживаются нигде. По крайней мере, я не встречал ещё таких продуктов. Какой-нибудь С++98, только если, всякие монстры типа Enterprise Architect, Visual Paradigm вроде худо-бедно умеют.
    Ответ написан
    Комментировать
  • Есть ли такое сообщество, в котором программисты тренеруются собеседоваться, а интервьюеры собеседовать?

    TrueBers
    @TrueBers
    Гуглю за еду
    Клин клином вышибают. Просто ходите на них. Чем больше пройдёте, тем больше будет всё равно.
    Страх побеждается только многократным испытанием его.

    И поменьше важности. Чем больше вы хотите эту работу и вкладываете важности в это, тем больше будет косяков на пути. Просто забейте, идите туда оценить ситуацию, разведать, на девочек посмотреть, с мужиками попиздеть. Пройдите в недельку штук 10-12 собеседований. Потом ваще будет настолько всё равно на это всё, что не вы будете бояться, а вас будут бояться, отчего вы такой уверенный.
    Ответ написан
    Комментировать
  • Кто-нибудь знает толковый/любой обозреватель исходных файлов?

    TrueBers
    @TrueBers
    Гуглю за еду
    В плюсах не так всё просто, как в дотнете. Стандартных возможностей для этого не существует в природе. Си и С++ по сути являются высокоуровневым ассемблером без какой-либо метаинформации. Здесь всё зависит от наличия отладочной информации в файле. Если её нет, то вы увидите только ассемблерный код. Максимум сможете только найти строки, которые использует программа. Но даже с отладочной инфой вы не получите ни имён, ни переменных, ни классов. Будут абстрактные наборы процедур, которые, при наличии опыта реверсинга можно будет определять на глаз.

    При этом, в плюсах можно статически компилировать. И этот статический код вы никак не сможете отделить от вашего. Можно, например, скомпилировать хеллоу ворлд на 30 мегабайт на каком-нить фреймворке, и из них вашего кода будет только несколько десятков байт. Существуют, конечно, всякие сигнатурщики, костыли, но они работают только в идеальных вакуумно-сферических программах, которых не бывает. Обычно такое реверсеры пишут чисто для себя, не выкладывая в паблик.

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