Задать вопрос
Ответы пользователя по тегу C++
  • Объясните: какую базу нужно иметь для изучения Dirext X [C++]?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вам нужны знания графики. Понимания, как оно всё там работает под капотом. Без этого всего DirectX будет казаться чем-то космическим и непонятным. DirectX никак не завязан на чистый WinAPI. Он базируется на технологии COM. Это посложнее для понимания, чем WinAPI. Ну и, соответственно, это всё работает только на Windows.
    OpenGL чуть проще, там чистое Сишное API. Можно писать для множества операционных систем, в том числе, для мобильных платформ.

    Оба API используют конечный автомат для рендеринга, все состояния которого тоже нужно отлично понимать. У OpenGL, на мой взгляд, он более лёгок для понимания.
    Но для всего этого вам нужно знать, что используется там под капотом. Бездумно искать строки кода и копипастить их к себе не получится. Нужно знать что делает каждая функция, какие состояния конечного автомата меняют, и т. п.

    Если хотите начать учить всё это дело, советую начать с отличных статей на Хабре. Если вы осилите весь этот курс, то сможете писать хоть на OpenGL, хоть на DirectX, хоть на Unity/Unreal/CryEngine.
    Ответ написан
    Комментировать
  • C++ fstream. Не работает чтение из бинарного файла, почему?

    TrueBers
    @TrueBers
    Гуглю за еду
    Т.е по сути моя i должна быть равна 3
    Не должна она вам ничего, пока документацию не прочитаете.

    Зачем вы добавили ios::trunc при открытии файла?
    trunc от слова truncate, переводится как: обрезать, усекать, урезать, сокращать.

    В документации ясно написано же: trunc discard the contents of the stream when opening. Что переводится как, отбрасывает содержимое потока при открытии.
    Он же вам его очищает и открывает новый пустой файл, вы его читаете, а там нечего читать. Вот и результат.
    Ответ написан
    1 комментарий
  • Какая хорошая книга для начинающего программиста на С/C++ с уклном в сети?

    TrueBers
    @TrueBers
    Гуглю за еду
    Сети — это сети. А C++ — это C++. Не бывает такого, чтобы была книга сразу по двум громадным направлениям.

    Сначала учите C++, а потом сети.
    К тому же, под C++ нет сетевых API. Они все всё равно написаны изначально на чистом Cи и никак не пересекаются.

    Изучив понятие сетей, можно писать на любом языке.
    Ответ написан
    9 комментариев
  • Возможно ли вывести элементы list используя for_each?

    TrueBers
    @TrueBers
    Гуглю за еду
    Откройте документацию хотя бы, и прочитайте про входные параметры for_each:
    template< class InputIt, class UnaryFunction >
    UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

    От вас требуют на вход итератор на первый элемент first и итератор на последний элемент last. Ниже можно найти, что InputIt значит InputIterator.

    Теперь смотрим документацию std::list.
    Iterators
    begin   returns an iterator to the beginning 
    cbegin  (public member function)
    
    end     returns an iterator to the end 
    cend    (public member function)

    То, что нам нужно. begin() даст нам итератор на первый элемент, т.е. first, а end() — на last.

    Смотрим дальше
    Member types
    Member type	Definition
    
    iterator	BidirectionalIterator

    Смотрим, что такое BidirectionalIterator. Написано, что он должен быть в свою очередь ForwardIterator'ом. А ForwardIterator удовлетворяет концепту InputIterator. Как раз то, что нам нужно.

    В итоге, достаточно написать for_each(test.begin(), test.end(), show);

    Но, сейчас на дворе 2017 год, давно уже введены новые фишки в C++. Например, можно сходу передать анонимную функцию (лямбду) вместо обычной функции, в случае, если она однострочная:
    for_each(test.cbegin(), test.cend(), [](int v) {std::cout << v << std::endl;});

    Также, C++11 добавляет новые методы для получения константного итератора cbegin() и cend(), т. к. нам не нужно модифицировать список, лучше воспользоваться константными итераторами, чтобы избежать ошибок в случае случайной модификации.

    Либо, как уже сказали, если у вас слишком большое тело цикла, чтобы не городить из лямбд спагетти и чтобы это всё легко читалось, можно использовать range-for:
    for(const auto &v : test)
      std::cout << n << ' ';
    std::cout << '\n';
    Ответ написан
    Комментировать
  • Как создать кольцевой список на основе list?

    TrueBers
    @TrueBers
    Гуглю за еду
    Достаточно перегрузить итератор, закольцовывая его на начало при достижении конца, и наоборот. Вот и весь кольцевой список.
    Ответ написан
    Комментировать
  • Какую 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}});
    Ответ написан
    Комментировать