• Signal SIGABRT при использовании thread?

    myjcom
    @myjcom Куратор тега C++
    int main()
    {
    //...
        thread first (...);
        first.join();
        return 0;
    }


    www.cplusplus.com/reference/thread/thread/join
    Ответ написан
    Комментировать
  • Как удалить элемент вектора внутри цикла?

    @D3Nd3R
    Можно все сделать и без цикла:
    contours.erase(std::remove_if(contours.begin(), contours.end(),
    		[this](std::vector<cv::Point> vec)->bool
                             {return vec.size() < this->mParams.minContourSize; })
    		,contours.end());
    Ответ написан
    Комментировать
  • Подойдёт ли Rust для 3D игр?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Если прям горите желанием, то можно, но готовьтесь к тому, что весь функционал придётся писать самому и тулчейн тоже. Ну и багов дофига. Рано ещё, подождите пару лет.
    Ответ написан
    Комментировать
  • Какую IDE лучше использовать для C (Си) и C++ под windows 8.1 64 bit?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Имхо есть лишь 3 адекватных ide для среднестатичтического разработчика (то есть не учитываем адептов vim/emacs - это отдельный человеческий подвид/высшие существа )
    Visual Studio Community
    Qt Creator - https://www.qt.io/qt-features-libraries-apis-tools...
    CLion https://www.jetbrains.com/clion/

    Можно также навернуть плагинов на VSCode и будет более-менее удобно, но это уже не для начинающих.
    Ответ написан
  • Какими инструментами вы пользуетесь при разработке на C++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    1) IDE (QtCretor) -- без комментариев
    2) gcc -- компилятор, gdb -- отладчик; иногда clang/lldb
    3) git и tig (текстовый интерфейс для гита)
    4) valgrind -- в основном профилирование
    5) meld -- дифы
    6) vim -- когда надо что-то мелкое поредактировать на сервере
    7) браузер -- без комметариев
    8) Ну разные консольные утилитки по необходимости, grep, sed, nm...
    9) cppcheck -- статический анализ
    10) Иногда кланговые санитайзеры
    Ответ написан
    Комментировать
  • Можно ли в C++ передавать массивы в функцию сразу при объявлении?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    Можно так:
    #include <iostream>
    
    void func(std::initializer_list<int> data)
    {
    	for(const auto& item : data) {
    		std::cout << item << std::endl;
    	}
    }
    
    int main() {
    	func({1, 2, 3});
    	std::cout << std::endl;
    	func({1, 2, 3, 10, -1, 15});
    	return 0;
    }
    Ответ написан
    2 комментария
  • В каких случаях эффективнее дублирование кода вместо вызова функции?

    @res2001
    Developer, ex-admin
    Всегда пишите функции.
    Выставьте ключи оптимизации в компиляторе и отдайте этот вопрос на откуп компилятору - они справляются с этим на ура.
    Вручную стоит "инлайнить" только какие-то однострочные функции, указав inline в описании функции. Но обычно компиляторы именно к этим функциям применяют подобную оптимизацию.
    Ответ написан
    8 комментариев
  • Вопрос про GUI?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Хорош ли он?

    Зависит от критериев, по которым сравнивать. На мой взгляд, один из лучших фреймворков для создания GUI, и не только, хотя есть и недостатки. Ещё советую обратить внимание на QtQuick (это часть Qt).

    И самое главное возможно ли «вживить» это дело в Вижлу? Либо же нужно что-то отдельно?

    Вероятно, имеется в виду VS? Если так, то да, даже есть специальный плагин, но я бы рекомендовал QtCreator.
    Ответ написан
    1 комментарий
  • Какие оптимизации используются в языках С и С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне не нужен полный список низкоуровневых оптимизаций, таких как размещение переменных в регистры, а нужны такие, как вычисление константных выражений или раскрытие простых методов (get/set). Какие оптимизации в C и C++ различаются? В частности, рассматриваю gcc.

    gcc -Q --help=optimizers выведет список всех включенных в настоящий момент (другими опциями командной строки) оптимизаций. Что каждый из -f* ключей означает можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Option...
    Ответ написан
    1 комментарий
  • Как операционная система понимает, сколько нужно очистить память?

    @evgeniy_lm
    Как операционная система понимает, сколько нужно очистить память?
    Ни как. Ей фиолетово. А вот ваша прога это другое дело.
    char *array = malloc(256);
    теперь компилятор знает, что переменная array 256 байт
    free(array); //!
    и тут компилятор подставит в код очистки адрес переменной и ее размер.
    Ответ написан
    8 комментариев
  • Как скомпилировать нормально в 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 комментария
  • Как сделать наследование класса со структурой?

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

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

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

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

    nekipelov
    @nekipelov
    > fout.write((char*)&lastname, sizeof(firstname));

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

    fout.write(lastname.data(), firstname.size());

    Но ведь вам потом ее надо будет прочитать. А для этого надо знать ее размер, значит надо так:

    size_t size = firstname.size();
    fout.write(reinterpret_cast<const char *>(&size), sizeof(size));
    fout.write(lastname.data(), size);


    Соответственно потом читать сначала размер, а потом size байт. Но гораздо проще взять www.boost.org/doc/libs/1_64_0/libs/serialization/doc/, это позволит избежать множества граблей. Там есть все средства для работы с массивами.
    Ответ написан
    Комментировать
  • Конструктор по умолчанию?

    @MiiNiPaa
    Разница в том, что t1 — объект класса Test, а t2 — нет.

    Это функция ничего не принимающая и возвращающая экземпляр Test

    https://en.wikipedia.org/wiki/Most_vexing_parse
    Ответ написан
    2 комментария
  • Boost или не Boost вот в чём вопрос?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Если пишете что-то кроссплатформенное где будет много работы с сетью, то буст незаменим. Если же из буста нужно пару-тройку мелких функций задействовать (и в дальнейшем функциональность не будет расширяться), то можно и и самому написать. Правда, вам вероятно еще и с файловой системой придётся работать... Так что скорее всего вам нужен буст.
    Можно и другие библиотеки рассмотреть, которых, к слову, не так уж и мало.
    Ответ написан
    Комментировать
  • Какие есть нюансы в больших данных?

    Denormalization
    @Denormalization
    500 000 - 1 000 000 - это не БОЛЬШИЕ ДАННЫЕ. Любая БД с любыми настройками даже не заметит.
    Ответ написан
    9 комментариев
  • Мало весящий IDE для С++?

    Есть QtCreator, весит всего 85 МВ. Есть все необходимое: неплохой рефакторинг, навигация, git.

    UPD Немного слукавил 85 МБ это установщик, но с web-a он ничего не качает, а просто разархивирует.
    Ответ написан
    2 комментария
  • Как объяснить кусок кода C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Весь этот код (за исключением Close) — автогенерируемый.

    ///// Защита от повторного включения
    #ifndef Unit1H
    #define Unit1H
    
    ///// Хедеры VCL. Причём всё это сделано так, чтобы упростить написание ценой удлинения
    ///// компиляции. Более громоздкий, но и более удачный вариант.
    ///// В H:
    /////   namespace Controls { class TLabel; }
    /////   using namespace Controls;
    ///// В CPP:
    /////   #include <Controls.hpp>
    ///// Вот таким образом можно (было) избавиться от каскадного подключения
    ///// хедера Controls. А то каждый, кто использует главной форму,
    ///// автоматически подключает эти хедеры.
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    ///// Только от Forms.hpp избавиться таким макаром нельзя:
    ///// мы наследуемся от TForm.
    #include <Forms.hpp>
    
    ///// Класс формы. Все формы наследуются от TForm.
    class TForm1 : public TForm
    {
       ///// Особое право доступа Borland, для совместимости с Delphi.
       ///// Поля и свойства published не просто public, но включаются
       ///// в структуру рефлексии (aka reflection или introspection)
       ///// и программа о них знает при выполнении.
       ///// Применительно к формам — published-поля доступны
       ///// загрузчику.
    __published: // IDE-managed Components
       ///// Компоненты, которые мы установили на форме редактором.
    TLabel *Label1;
    TButton *Button1;
       ///// События, которые мы прописали в редакторе.
       ///// __fastcall — модель вызова, аналогичная Delphi.
       ///// Именно такая модель вызова принята в обработчиках
       ///// событий.
    void __fastcall Button1Click(TObject *Sender);
       ///// Пользователь пока не прописал никаких своих
       ///// полей и функций.
    private: // User declarations
    public: // User declarations
       ///// Конструктор. Раз уж у формы нетривиальный конструктор —
       ///// по правилам Си++ его надо повторить в подклассе.
       ///// Снова-таки, модель вызова __fastcall: в формах Delphi
       ///// используются т.н. виртуальные конструкторы, 
       ///// когда по имени класса можно создать объект этого класса.
       ///// Фабричный метод, только немного лучше.
       ///// Но это значит: у всех подчинённых классов
       ///// должен быть один и тот же набор параметров
       ///// и модель вызова.
    __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    ///// Как известно, переменная объявляется один раз.
    ///// Поскольку хедер может подключаться к огромному числу CPP,
    ///// её объявляют как extern (она есть, но в другом месте).
    ///// Макрос PACKAGE раскрывается в __declspec(package),
    ///// чтобы эту штуку можно было собрать как пакет.
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

    Модель вызова — это как технически мы вызываем подпрограмму. Какая память и какие регистры на это используются, и кто подчищает стек. Ищи в Википедии.
    Ответ написан
    Комментировать
  • Чем отличаются способы создания обьектов?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    1. Память. В первом случае память под объект будет выделена на стеке, во втором - в куче.
    2. Время жизни. В первом случае объект существует до выхода из области видимости, во втором - до вызова delete obj;
    Ответ написан
    Комментировать