Ответы пользователя по тегу C++
  • Как получить свой внешний 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 комментария
  • Как правильно организовать вечный цикл в отдельном потоке C++11?

    TrueBers
    @TrueBers
    Гуглю за еду
    А зачем вам тогда epoll? Чем он, в вашем случае, будет отличаться от обычного блокирующего сокета в отдельном потоке?
    Его смысл как раз в асинхронности и неблокируемости, а вы эти плюшки сводите на нет, вводите тормозящие мьютексы, очереди.
    Раз уж пишете на плюсах асинхронно, то возьмите библиотеку для этого, тот же Asio.
    Ответ написан
  • C++ std::thread разное поведение на linux и windows, в чем может быть проблема?

    TrueBers
    @TrueBers
    Гуглю за еду
    Изучите буфферизацию стандартных потоков, там много нюансов.

    1. Как вариант, используйте std::cerr, он небуфферизирован, но вывод будет идти в stderr. Для буферизированного stderr используйте std::clog
    2. Второй вариант: если не нужна новая строка, используйте явный << std::flush.
    3. Если нужна новая строка в конце и сброс буфферов, добавляйте к потоку << std::endl. Он содержит в себе неявный flush.
    4. std::cout же пишет в собственный буфер, а когда он сбросит его в stdout, никто кроме него самого не знает. Для важных данных его не используют, для быстрых и частых — тоже, т. к. медленный.
    Ответ написан
    2 комментария
  • Получить handle и размер файла С++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Код
    #include <iostream>
    #include <numeric>
    #include <fstream>
    #include <filesystem>
    namespace fs = std::filesystem;
    
    using file_buffer_ptr  = std::unique_ptr<std::vector<char>>;
    using file_buffer_iter = std::istreambuf_iterator<file_buffer_ptr::element_type::value_type>;
    using file_list        = std::vector<file_buffer_ptr>;
    
    static file_buffer_ptr fillBuffer(const fs::path &currentFile)
    {
        auto fileBuf = std::make_unique<file_buffer_ptr::element_type>();
        fileBuf->reserve(fs::file_size(currentFile));
    
        std::ifstream fileStream(currentFile, std::ios::binary);
        fileBuf->assign(file_buffer_iter(fileStream), file_buffer_iter());
    
        return fileBuf;
    }
    
    int main()
    {
        file_list files;
        auto directory = "/tmp";
    
        try {
            for (auto& currentFile: fs::recursive_directory_iterator(
                                        directory,
                                        fs::directory_options::skip_permission_denied
                                    )) 
            {
                if (!fs::is_regular_file(currentFile))
                    continue;
    
                files.emplace_back(fillBuffer(currentFile));
            }
        } catch (const std::exception &e) {
            std::cerr << "Error: " << e.what() << std::endl;
        }
    
        std::clog << "Found " << files.size() << " files, total size " << 
            std::accumulate(files.begin(), files.end(), 0,
                [] (file_buffer_ptr::element_type::size_type total, const file_buffer_ptr &b) {
                    return total + b->size();
                })
        << " bytes" << std::endl;
    
        return 0;
    }


    А handle никак не относится к C++, это фича конкретной операционной системы.
    Ответ написан
    Комментировать
  • Что должен знать, помимо ЯПа крестовый джун?

    TrueBers
    @TrueBers
    Гуглю за еду
    Нет в C++ никаких трендов. Здесь как писали 20 лет назад, так и пишут.

    STL, Boost, Qt, WinAPI, MFC, POSIX, BSD, OpenCV популярен очень. Отладчики WinDBG, Visual Studio, gdb, lldb. Компиляторы clang, gcc, MSVC++. Системы сборки make, Cmake, MSBuild. Среды разработки Visual Studio, Clion, QtCreator. Ассемблер ещё знать желательно, основы работы кеша и памяти, как процессор попадает в кеш, как промахивается, почему один способ обхода памяти тормозит, а другой работает быстрее.
    Есть, конечно, и хипсторы местные со всякими Rx'ами, интеграциями Node.js'а и прочими биткоинами. Но таких мало и они быстро сливаются в другие языки, остаётся классика.
    Системы контроля версий к C++ никак не относятся. Хоть на дискетке почтой посылайте, никто вас не заставит. Везде гит, преобладает, как и в остальном мире.
    Из относительно нового только, что GSL из Core Guidelines да folly от фейсбука.

    Проблема вакансий в другом: чистый плюсовик почти никому не нужен. Обычно плюсовиков ищут совмещающих с джавой, шарпом, даже питоном и джаваскриптом.
    Ответ написан
    1 комментарий
  • Как в C/C++ нарисовать свое окно без winapi?

    TrueBers
    @TrueBers
    Гуглю за еду
    Можете свою оболочку explorer написать на OpenGL или DirectX, например. А лучше, идите работать, вас там займут делом.
    Ответ написан
    2 комментария
  • Где найти пример UDP сервера на асинхронных сокетах?

    TrueBers
    @TrueBers
    Гуглю за еду
    Так, а в чём принципиальная разница с TCP то? Там же ещё проще должно быть: не нужны никаких обработки коннектов, отваливаний, стриминга. Шлёшь себе втупую датаграммы, когда сокет свободен, и принимаешь — когда буфер не пустой, и не паришься.
    И почему не нравятся библиотеки? В них же за вас уже все косяки и баги порешали. А их там, поверьте, хватает. Где-то poll тупит, где-то нет epoll, где-то файловый IO ещё вешается нормальный. В винде вообще IOCP вместо всего этого используется, и тот через жопу.
    И, разве, в man epoll нет примера? В своё время мне хватило его, насколько я помню.
    Ответ написан
    2 комментария
  • Почему в более современных версиях Microsoft Visual Studio не поддерживается класс WindowsForm?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вы в ланчере студии просто не выбрали этот компонент для установки.
    А лучше, используйте WPF.
    Ответ написан
    1 комментарий
  • Перебор дочерних компонентов в c++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Хоть бы какие-то данные что ли представили... телепатов нету ж уже.

    Судя по слову "hwnd", будем считать, что вы используете WinAPI. Тогда есть же ГУГЛ, который первой же ссылкой выдает ответ на вопрос на StackOverflow. Вторая ссылка ведёт на саму функцию EnumChildWindows на MSDN.

    Если я правильно понял задачу, тогда в чём проблема?
    Ответ написан
    Комментировать
  • Какую библиотеку под OpenGL выбрать?

    TrueBers
    @TrueBers
    Гуглю за еду
    Я ж уже отвечал на подобный вопрос.
    Есть отличный туториал. В нём всё подробно описано, какую учить, какая устарела, какая для чего предназначена и т. д.
    Ответ написан
    Комментировать
  • Какой выбрать современный хороший учебник по C++?

    TrueBers
    @TrueBers
    Гуглю за еду
    То есть сухое краткое структурированное изложение стандарта на русском

    Стандарт учить не нужно. Учить стандарт и учить С++ это 2 разных измерения. Стандарт учат те, кто пишет компиляторы, а прикладному разработчику достаточно знать о его существовании, где его найти в случае какого-то глобального непонимания и недостатка информации в других источниках. Не запаривайтесь ни на каком стандарте, это абсолютно бесполезная трата времени вначале.

    Поменьше воды типа "в старом стандарте было иначе, а именно вот как".

    Без этого никак, новый стандарт никак не отменяет старый. Есть в языке такие фичи, которые добавили в 11 стандарте, а в 14-м уже объявили miss-conception и deprecated, а в 17-м вообще удалили. Поэтому знать, что было в старых стандартах просто необходимо для понимания, почему так происходит.

    Сейчас C++ в таком состоянии, что книги по нему не успевают выходить, как всё меняется. Сейчас столько источников информации, что каждый день выходит миллион статей от официальных лиц комитета. Подпишитесь на ютубе на официальные каналы, на RSS фиды, на блоги не последних людей комитета. Мне сейчас в RSS приходит каждый день столько, что, когда работал в офисе, успевал во время дороги в офис читать по-диагонали лишь основную мысль. Сейчас работаю дома, и ничего не успеваю. Подпишитесь на CppCon, BoostCon, ISOCpp, Скотта Мейерса, Андрея Александреску, Герба Саттера, Бьёрна Страуструпа. Библиотека Boost служит, по сути, испытательным полигоном для стандарта, так что советую и её начать использовать сразу же вместе с основным стандартом. Ознакомьтесь также с Core Guidelines, это как бы набор костылей для вещей, которых пока нет в стандарте, но которые всем необходимы и будут скоро добавлены.

    Книги же, по современному языку, рассчитаны, так или иначе, на тех, кто уже знает старый язык, бессмысленно писать новые книги с нуля, проще описать, что изменилось. Из более-менее полезного материала, читайте Скотта Мейерса Effective Modern C++: 42 Specific Ways to Improve ..., Anthony Williams C++ Concurrency in Action: Practical Multithreading, ну и вышеперечисленных.
    Ответ написан
    Комментировать
  • Матрицы и выполнение собственных операций с матрицами в OpenGL?

    TrueBers
    @TrueBers
    Гуглю за еду
    Во-первых, эта "суперкнига" устарела, как говно мамонта, ни в коем случае нельзя по ней учиться, она научит нехорошим древним костылям, которые давно уже не используются и удалены из стандарта в современных версиях! Прямо сейчас выкиньте/удалите/сожгите её и забудьте всё, что успели заучить из неё! В 2017-м году она не имеет никакой ценности. Сейчас в OpenGL всё по-другому.

    Во-вторых, эти функции давно официально объявлены устаревшими и категорически не рекомендуются к использованию, как и целиком весь immediate-mode rendering. Вместо immediate-mode сейчас используется Core Profile с программированием отдельных стадий графического конвеера, а вместо конкретно этих функций рекомендуется пользоваться библиотекой GLM.

    Современный OpenGL начинается с версии 3.3. По сути, он является основой, в которую добавляются разные фичи.

    Учиться советую по замечательным туториалам от Джоуи де Фриза, он там разбирает всё очень подробно и пошагово. Очень крутой туториал, крайне рекомендую!
    Ну и, конечно же, OpenGL Programming Guide (9th Edition) — топовая книга по OpenGL с полным фаршем последней версии. Но её лучше использовать как справочник, учить по ней, для новичка, будет довольно проблематично.
    Ответ написан
    Комментировать
  • Есть ли хорошие книги по OpenGL без программирования?

    TrueBers
    @TrueBers
    Гуглю за еду
    Как программировать без программирования, как есть без еды, как дышать без воздуха... вы о чём вообще?

    OpenGL —это графическое API (Application Programming Interface). Как можно учить programming interface без самого programming?

    Может, вы путаете OpenGL с общим понятием графики вообще?

    Если вы уверены, что не путаете, ответ — такого не бывает. Без примеров, проб и ошибок ничего не учится...

    Ну, а классика среди книг по OpenGL — OpenGL Programming Guide (9th Edition)
    Ответ написан
    Комментировать
  • Как лучше поставить Visual Studio 2017?

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Хватит плодить вопросы. Ответ на них не поместится на десяток страниц. Почитай лучше про адресацию памяти, что такое абсолютный адрес, относительный, что такое базовый адрес процесса, что такое рандомизация базового адреса. Просто так взять и прочитать память не получится.

    1. Этот адрес работает только для текущего процесса.
    2. Во-вторых, он будет другим при каждом запуске и выделении памяти из кучи.
    3. Он так же может меняться из-за ASLR

    Чтобы докопаться до реальной структуры данных с информацией о персонаже, нужно найти то место в коде, где эта структура выделяется на куче. Т. е. там должно быть что-то типа
    CharInfo info = new CharInfo();
    (_thiscall) CharInfo::CharInfo(info)

    Вот этот кусок кода тебе нужно найти, только так ты сможешь определить статическое место, откуда потом уже будешь плясать. Для поиска кода нужно знать хотя бы основы Ассемблера. Поможет в этом декомпилятор IDA Pro с плагином Hex-Rays.
    Но и этих мест может быть не одно, а десятки и сотни в случае с шаблонными классами и функциями. Тут уже нужен отладчик, чтобы поставить точки останова на чтение или запись памяти, и от них уже отталкиваться.

    Обычным чтением из памяти ты ничего не добьёшься, чтобы пойти по цепочке вызовов с необходимым адресом, тебе нужно самому внедрять свой код в клиент игры, либо пользоваться фреймворками для динамической инструментации, например, DynamoRIO, Intel PIN, Frida.

    Тесты лучше проводи на пиратке, ибо официальный клиент может забанить за такие действия.

    Начать можно, кстати, с курса Рикардо Нарвахи "Введение в крекинг с нуля, используя OllyDbg". Это огромный курс статей, в которых разбирается всё, что нужно для понимания основ. Там 50 с чем-то глав различной сложности, погугли. Есть ещё на ютубе целый плейлист с видео-разборами этого курса.
    Ответ написан
    Комментировать