Задать вопрос
  • Как скомпилировать нормально в Clion?

    TrueBers
    @TrueBers
    Гуглю за еду
    Я хочу просто получить .exe файл который будет работать на компьютере! один файл в котором сраный hello world
    Что на C++ это невозможно?
    На C++ возможно всё, просто это такой язык, в котором за вас никто ничего не будет делать, вы несёте ответственность за каждую мелочь, за каждую опцию, и должны это всё понимать, в отличие от других языков.

    Погуглите, что такое статическая и динамическая линковки, что такое единица компиляции, объектный файл, почитайте про процесс линковки, как разрешаются имена во время линковки, почему могут быть коллизии, и т. п.
    В любом языке программирования существуют runtime-библиотеки. В них хранится вся встроенная логика и стандартные библиотеки языка. В нормальных условиях принято линковать динамически. Это когда есть динамическая библиотека (DLL, SO, dynlib), она загружается в память единожды и её могут использовать все, кто к ней прилинкован.

    Вы же используете Clion, который, в свою очередь, использует CMake для управления проектом. У CMake, как и, собственно, у многих других систем сборки, есть такая штука, Deploy называется. Вы же, как PHP-разработчик, ведь тоже выполняете деплой, верно? Точно так же делается и здесь, особенно на винде. Вам нужно написать CMake-target для деплоя, который сам посмотрит, что нужно вашему "сраному hello world'у", и соберёт в одном каталоге эти все дела для запуска. Дальше вы выбираете в CLion в поле Build/Run Configuration свою цель деплоя, жмёте Build. И все оказывается в одной папке и беспроблемно запускается везде.

    Вот здесь есть пример использования модуля BundleUtilities для деплоя (fixup_bundle).
    Ответ написан
    2 комментария
  • Какая хорошая книга для начинающего программиста на С/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 тысяч параметров. Но настроив под себя, довольно удобно получается, хотя, мало кто это осиливает.
    Ответ написан
    Комментировать
  • Opengl 4.* или vulkan?

    TrueBers
    @TrueBers
    Гуглю за еду
    Это вообще разные вещи.
    Нужно отличать изучение API, от изучения технологии. Если вы хотите выучить просто API, учите что угодно, ибо разницу заметите только, когда поймёте основы, базу.

    OpenGL проектировался когда были другие архитектуры железа. Мультипроцессорность была только в теории, и считалась уделом суперкомпьютеров и ненужной для пользовательских ПК.
    Можно привести аналогию: OpenGL == C++, Vulkan == асинхронный Assembler + hardware threads. Например, в C++ сейчас довольно много архитектурных косяков, которые пытаются решить новыми стандартами, объявляют какие вещи устаревшими, потому что они концептуально неверны и не подходят под современные реалии.
    Но, при этом, вы можете всё то же самое написать на ассемблере, но нужно намного лучше понимать, как работает процессор и ОС, самому писать примитивы синхронизации, и т. п.

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

    В итоге, я бы ответил так:

    Если вы будете заниматься графикой как наукой, дико задротить а-ля Кармак в студенчестве с его движками, что-то исследовать, писать какие-то гениальные алгоритмы, защищать на этом диссертации, публиковать их, рассказывать потом на конференции, как вы круто справились с какой-то насущной задачей, повысили производительность, то тогда учите Vulkan. Vulkan — это именно про графику как технологию, про производительность, про инжиниринг и архитектурный дизайн, а не про API и само программирование. С вулканом придётся больше сидеть с диаграммами, документациями и строить архитектуру, придумывать методы взаимодействия частей этой архитектуры, синхронизации состояний, нежели писать код.

    Если же вы пишете простые прикладные вещи, которым нужно показать какую-то графику, то учите OpenGL. Здесь вы учите только API, соглашаясь с уже готовым, слегка устаревшим, архитектурным дизайном.

    Если хотите писать игры не мирового класса, то учите готовые движки, Unity или Unreal. Они уже поддерживают за вас Vulkan, продумали за вас API и архитектуру.
    Ответ написан
    2 комментария
  • Как понять принцип работы кода из книги "Философия Джавы"?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вы руками что ли исходники из книги набиваете?
    Вот же официальные исходники от автора. Скачайте и разбирайтесь себе спокойно.
    Ответ написан
    4 комментария
  • На какой базе собирать компьютер?

    TrueBers
    @TrueBers
    Гуглю за еду
    Во-первых, вам точно не нужны 128 гигабайт памяти, это абсолютно бессмысленная трата денег. 32 хватит с головой, поверьте. Виртуалки умеют memory ballooning, с ним вы можете запустить на 128 гигабайтах памяти около тысячи инстансов однотипных виртуалок. Зачем вам это может понадобиться... ума не приложу.

    Во-вторых, GTX 1070 в SLI точно так же не имеет смысла после того, как вышла 1080Ti. Деньги те же, производительность та же, меньше жарит, меньше шума, меньше блок питания нужен, нет задержек на шине при синхронизации, меньше точек отказа. В случае чего, можно докупить потом вторую 1080Ti, но при этом придётся поменять процессор, ибо у этого не хватит линий PCIe.

    Асус Стрикс — весьма сомнительная переплата за понты и цветные светодиоики.

    Проц, если вам действительно для работы, лучше взять с ибея Xeon 2683 v3. Те же деньги, но 14 ядер и 40 PCIe линий против 28 у 6800k. Можно подшаманить биос, разогнать до 3.1ГГц с разлоченным турбобустом. В итоге, этот проц, при цене в 20к, свободно делает десятиядерник i7-6950X за 100 тыщ рублей на мультиядерных задачах.
    Ответ написан
    9 комментариев
  • Как поймать ошибку в visual studio?

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

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

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Раньше перепробовал все популярные дистрибутивы с дистровотч.
    Пока не дошёл по списку до Арча. Пользуюсь уже лет 8, никаких проблем не было за это время. Всегда свежайший актуальный софт, все существующие пакеты есть в пользовательских репо. Заводится на любом железе: стоит на 3-х ПК, одном ноуте, 2 серверах и Малине. Пересадил брата с мерзкого OpenSUSE, брат жив. Если делать всё адекватно и понимать, что делаешь, читать официальные новости/вики, в которых пишут, если есть какая-то особенность обновлений и т. п., то проблем не будет.

    Конечно, знаний нужно побольше, чем мышкой возить в бубунте, но оно того стоит. Например, rolling release — штука довольно непонятная для большинства. Здесь нужны понимания, что такое версии SO-библиотек, как от них зависят исполнимые файлы, как их безболезненно обновлять и т.д. Ну, это если в бою использовать.
    А если на домашнем компе, который можно перегрузить свободно, то просто, нужно усвоить правило: не устанавливать новые пакеты без обновления старых, с каждым апдейтом желательно перегружаться, и проблем не будет.
    Ответ написан
  • Игровой ПК до 35000 руб? Какие комплектующие лучше подобрать?

    TrueBers
    @TrueBers
    Гуглю за еду
    Для современных игр в 4k вам нужна минимум GTX1080. Карты, уровнем ниже, тупо не потянут такое разрешение.
    Т. е. в ваш бюджет входит только видеокарта...
    Ответ написан
    2 комментария
  • Как сделать наследование класса со структурой?

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

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

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

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Абсолютно ничего не зависит. Там всё рандомно. Был свидетелем того, как в семейной паре одному дали визу, а другого завернули. Хотя они какие-то там приглашения показывали.

    Сам получал 4 года назад визу в США с девственно чистым заграном, полученным неделю назад. На интервью не спросили ничего, т. е. совсем ничего. Просто взяли и одобрили молча, хотя приглашение было с собой, но я его даже достать не успел. И вообще ни одного документа, кроме паспорта, не успел достать.
    При этом, буквально за пару человек до меня в очереди, мужик, который всю жизнь мотается в Штаты, имеет кучи каких-то международных ксив, пермитов, кучи бумаг, получил отказ.
    Ответ написан
    Комментировать
  • Как узнать время выполнения сортировки в C++?

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

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Чем обусловлена такая разница?
    Баблом.
    Анрил пилят сотни инженеров за бабки. А огры — костылями студенты за чсвешчку. Вот и вся разница.

    OpenGL может выдать абсолютно то же самое, что и directx или вулкан. Потому что это все — API. А это в, свою очередь — просто соглашение, как нужно писать. У стандартов графических API нет понятия качества картинки. Качество зависит только от профессионализма разработчика, как инженера-математика, его фантазии отчасти, способностей нестандартно мыслить.

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