Задать вопрос
  • Project Properties в Чужом проекте - Как не зависать по пустякам?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    Волшебной таблетки нет, всё приходит с опытом. Но сколько бы опыта в программировании у вас ни было, говнокод читать всегда будет тяжело.
    Ответ написан
    Комментировать
  • Выбор типа переменной класса в зависимости от параметра шаблона (C++17, if constexpr)?

    Cyapa
    @Cyapa
    Лучше воспользоваться частной специализацией и сделать вот так:

    template < EC_SPI_CFG_DATA_FRAME FRAMES >
    struct spi
    {
        mutable uint16_t* p_tx = nullptr;
    };
    
    template < >
    struct spi<EC_SPI_CFG_DATA_FRAME::FRAME_8_BIT>
    {
        mutable uint8_t* p_tx = nullptr;
    };
    Ответ написан
    1 комментарий
  • Почему в C++ указатели так себя ведут?

    15432
    @15432
    Системный программист ^_^
    int *aaa; //переменная с именем aaa типа "указатель на int", расположена в некоторой ячейке памяти, выделенной на стеке
        aaa = new int(6);  //присваиваем переменной aaa новое значение, а именно, адрес выделенной ячейки памяти в куче, содержащей значение 6
        qInfo() << aaa;       // 0x6a4e50   <- узнать тот самый адрес, что мы присвоили указателю
        qInfo() << *aaa;      // 6          <- перейти по этому адресу и извлечь значение 
        qInfo() << &aaa;      // 0x28fbe8   <- адрес ячейки, где лежит значение самой переменной aaa
        qInfo() << &*aaa;     // 0x6a4e50   <- перешли по указателю, который лежит в aaa (ячейка в куче, содержащая значение 6), потом узнали адрес этой ячейки, и конечно это тот самый адрес, по которому мы перешли
        qInfo() << *&aaa;     // 0x6a4e50   <- узнали адрес ячейки стека, по которому расположена переменная aaa, потом перешли по нему и извлекли значение переменной aaa. то же самое, что и просто обратиться к aaa
        qInfo() << *&*&*aaa;  // 6 тож самое что и выше, все &* нивелируют друг друга (переход по адресу и опять получение того же самого адреса обратно), остаётся только *aaa, ну а там лежит 6
    Ответ написан
    2 комментария
  • Есть ли смысл учитывать аппаратное количество потоков в игровом движке?

    @nirvimel
    Пул потоков по умолчанию содержит число потоков, равное количеству ядер аппаратных потоков. У этого пула есть входная очередь (lock-free), куда сабмитятся поступающие таски. Когда CPU недонагружен очередь пустая. Когда все потоки заняты, очередь растет.

    Это рецепт максимальной производительности, за исключением того случая, когда по условиям задачи критично, чтобы большое количество тасков выполнялось реально параллельно (например сами задачи продолжительные, а разбивать их на подзадачи нет возможности или желания), тогда все задачи должны быть разложены по отдельным потокам ОС.

    Кстати, очередь задач на пуле потоков - это именно то, как многозадачность реализуется внутри ОС. Только тут сами потоки ОС являются тасками, которые ставятся в очередь. Разница в производительности объясняется тем, что переключение тасков в юзерспейсе легче (следовательно быстрей), чем переключение потоков ОС.
    Ответ написан
    2 комментария
  • Возможно ли вывести элементы list используя for_each?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    А почему должно? list - это вам не массив, где элементы лежат одним куском в памяти. Вообще говоря, вас не должно волновать, как они там лежат, используйте .begin() и .end() для получения итераторов на начало и конец списка. И в данном случае можно было бы применить range based for.
    Ответ написан
    Комментировать
  • Какую IDE выбрать для С++ под Linux?

    @Gytim
    QtCreator или Visual Studio Code. В первом случае парится не надо с настройкой и установкой и все готово, во втором настроить так как себе нужно.
    Ответ написан
    Комментировать
  • Как поймать ошибку в visual studio?

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

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

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

    alexsandr0000
    @alexsandr0000
    Программист C#/C++/C
    Тут как я вижу два подхода использовать EMGU (openCV) или реализовывать алгоритм самостоятельно, как вариант использовать корреляционную функцию или FFT, а также можно использовать нейронные сети. Если изображений много и время на их обработку критично, то использование с++ + OpenCv более предпочтительней, хотя и сложней, но производительность тут существенно выше. Ну и в качестве экзотики использовать для этого DSP или ПЛИС
    Ответ написан
    3 комментария
  • Игровой ПК до 35000 руб? Какие комплектующие лучше подобрать?

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

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

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

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

    ThePyzhov
    @ThePyzhov
    iOS Ninja
    За какое время можно выучить C++

    За какое время можно научиться собирать самолеты "Боинг", умея собирать мотоциклы "Урал"?
    Ответ написан
    3 комментария
  • Обработка разнобитных bmp картинок, в чем конкретная разница?

    15432
    @15432
    Системный программист ^_^
    В случае 24 бит, на каждый пиксель приходится по 3 байта - значения для красного, зелёного и синего цветов.
    Для 16 бит на пиксель приходится уже 2 байта, придётся "выдёргивать" цвета уже побитно (на красный и синий отводится 5 бит данных, на зелёный 6 бит)
    8 бит - один байт на пиксель, либо оттенки серого, либо в заголовке будет таблица соответствий цветов, в которой каждому значению байта соответствует 24-битное значение цвета. Всё это придётся расшифровывать.
    2 и 4 бита аналогично 8 бит, только ещё меньше цветов.
    Помимо всего этого, может присутствовать RLE сжатие, которое придётся распаковывать и запаковывать. Сжатие примитивное, но всё же экономит место.

    P.S. Если вы используете BMP библиотеку, которая любой формат вам превращает в набор значений RGB, заморачиваться и не нужно, либа сделает всё за вас.
    Ответ написан
    3 комментария
  • Что нужно знать для разработки MMO игры?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Нужно иметь овердофига опыта в разработке более простых игр. Богатейший опыт в работе сетевых вещей. И овердофига денег.
    Ответ написан
    Комментировать
  • Почему в Питоне нельзя складывать строки?

    aRegius
    @aRegius
    Python Enthusiast
    Можно, но это некрасиво/плохо читаемо. Много лишнего "шума": плюсы, кавычки, экранирование, все это вперемешку с переменными, а значит более error prone...

    Судите сами:
    >>> name = "NAME"
    >>> input_path = "INPUT_PATH"
    
    >>> print("\""+name+"\" - ERROR! File not found in \""+input_path+"\"")
    "NAME" - ERROR! File not found in "INPUT_PATH"
    
    # не лучше ли, "мальчики-налево, девочки-направо" ?
    >>> print('"{0}" - ERROR! File not found in "{1}"'.format(name, input_path))
    "NAME" - ERROR! File not found in "INPUT_PATH"


    Плюс ко всему, допустим, вам нужно добавить пусть даже всего одну переменную между словами "File" и "not". Ну, к примеру, пусть еще раз имя ненайденного файла name. В приведенном вами варианте, мы еще больше "устрашим" себя и своих коллег кодом, осознание которого требует нечеловеческой концентрации:
    >>> print("\""+name+"\" - ERROR! File \""+name+"\" not found in \""+input_path+"\"")
    "NAME" - ERROR! File "NAME" not found in "INPUT_PATH"


    В то время как применяя метод format() все, что нам нужно - добавить дополнительную пару curly braces:
    >>> print('"{0}" - ERROR! File "{0}" not found in "{1}"'.format(name, input_path))
    "NAME" - ERROR! File "NAME" not found in "INPUT_PATH"


    Согласитесь, выгода очевидна.
    Ответ написан
    7 комментариев
  • Можете объяснить код?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    Когда ж вы научитесь документацию читать? Тут всё очень подробно расписано: en.cppreference.com/w/cpp/algorithm/sort а про итераторы можете почитать либо в другом разделе документации, либо в какой-нибудь хорошей книге(Прата например)
    Ответ написан
    2 комментария
  • Есть ли алгоритм тестирования лабиринта на отсутствие замкнутых пространств?

    @alex_ak1
    Если лабиринт на сетке или графе (а как его еще можно задать-то, кстате), то простой волновой алгоритм. Проводим волной и смотрим, есть ли недоступные, можно ли дойти от конца до начала.
    Ответ написан
    1 комментарий
  • Байт вмещает 256 символов?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    в военное время в байт можно всунуть и больше

    но обычно работает примерно так

    число одно, значение его от 0 до 255
    Ответ написан
    2 комментария
  • Кто-нибудь знает толковый/любой обозреватель исходных файлов?

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

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

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

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

    А для работы со строками в c++ есть std::sring и там есть метод для выделения подстроки.
    Ответ написан
    Комментировать
  • Как работает этот код?

    @MiiNiPaa
    Может ли n быть больше нуля, если перед этим мы делаем count = 0?
    static unsigned long count = 0;
    Объявляет и инициализирует переменную. Переменная инициализируется только раз за время своей жизни. В случае статической переменной — перед первым запуском функции.
    То есть, начальное значение n — 0, после этого обратно в ноль она больше не сбрасывается.
    зачем здесь mutex
    Подумайте, что случится. если два потока наткнутся на инкремент одновременно юез синхронизации. Особенно при существовании кэша, присутствии оптимизаций, консолидирующих запись в память и тому подобного. На самом деле тут лучше использовать атомик, ну да ладно.
    Ответ написан
    Комментировать