• Какую роль играют float и double в скобках?

    @MarkusD Куратор тега C++
    RabraBabr,
    а вообще корректно сравнивать между собой два вещественных числа?

    Корректным в C++ является только сравнение значений одного типа между собой. Если полагаться на неявное приведение при сравнении, то выстрелить себе в ногу становится очень легко. Не смотря на то, что C++ это все позволяет.

    yourtexthere, понимать совершаемое - это значит полностью усвоить информацию о совершаемом процессе, выработать навык безошибочного совершения процесса и иметь возможность на каждом шаге экспертно оценить правильность хода совершаемого процесса.
    Нет ничего страшного в том, что ты не понимаешь то, что делаешь. Нет ничего страшного в том, что ты признаешь очевидное для профессионала. Это - просто твои обстоятельства. Слова автора ответа - это просто изложение твоих обстоятельств в тексте.
    Изложенный тобой код действительно безграмотен и на самом деле он не работает так, как ты думаешь. Совпадение результата этого кода с библиотечным значением - чистая случайность.
    И для твоего уровня знаний - это нормально. Нечего стесняться своей безграмотности тогда, когда с ней нужно бороться через изучение и практику.
  • Почему доступ к элементам vector-а O(1)?

    @MarkusD Куратор тега C++
    Quark,
    Но если он основан на динамическом массиве, то как тогда выполняется вставка элементов?

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

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

    @MarkusD Куратор тега C++
    Дмитрий, душнить, поди, в твоем репертуаре. :) Но и сыпешься ты знатно тоже.

    так и чему он не равен?

    Кто тебе тут сказал что он чему-то не должен быть равен? Или должен? Твоя ошибка - твои проблемы.

    в пропозале C++ написно, что он отложен до C++29.

    Это ты к чему? Кто тебя хоть что-то просил написать про FAM в C++? Перечитай вопросы внимательно и ответь как положено.

    Мне в целом фиолетово, что написано в стандарте, мой код компилирует компилятор, а не стандарт.

    Ну вот в этом и есть основная проблема армии мальчиков, опирающихся на результаты транслятора. Жизнь слепого котенка, конечно, легка и беззаботна, но куда она выведет?
    Транслятор пишется людьми. Люди ошибаются. Ошибка - это нормально, когда ее можно обнаружить и исправить. Но чтобы обнаружить ошибку транслятора, нужно в деталях и тонкостях знать используемый стандарт языка. Ты же опираешься на выдачу транслятора и просто не можешь отследить те моменты, когда транслятор тебе нагнал. А я спокойно пишу отчеты для MSCL, clang и GCC по всем найденным ошибкам. Вот и все.

    ОК. На этом мои полномочия -- всё.

    Ну, т.е. ты слова снова на ветер бросил? Сам бы мог для начала подумать о том, что код демонстрирует и что в нем упрощено для демонстрации. Ты вот только выравнивание заметил, а целую гору остальных нюансов не смог что ли? Душнить же пришел, вроде. ))

    Предлагаю тебе в следующий раз начать общение немного в другом тоне. Возможно и обсуждение выйдет более конструктивным.
  • Можно ли выделить память определенного размера?

    @MarkusD Куратор тега C++
    Дмитрий, первое: пользуемся "Ответить" тому, кому отвечаем. Это удобно, поверь. :)
    Второе: после C99 стандартов больше нет? Какой стандарт C является совместимым с C++17 и что в этом стандарте написано про FAM?

    А ещё у вас UB, когда вызываете placement new на невыровненный массив байтов

    Байт. На невырАвненный массив байт. Ну да, так и есть, и что дальше?
  • Можно ли выделить память определенного размера?

    @MarkusD Куратор тега C++
    Dmitrii
    Вы можете использовать только так:

    Однако же, "почему-то" работает и такое. И не просто работает, а даже в стандарт укладывается.

    То есть размер должен быть известен на момент компиляции.

    И выход за этот размер приведет к UB, сколько бы там памяти выделено ни было.
  • Что за типы функций при импорте OpenCV DLL в Delphi?

    Laax, под вопросом остается только то, какой системой сборки собрана обсуждаемая DLL и в какой среде производится импорт ее символов.
    Не подскажешь по этим пунктам?
  • Как настроить Git для работы с Си/Си++?

    Filipp42, ну тогда решением твоего вопроса будет: Не стоит браться помогать там, где ты ничего не знаешь.
    Очень высок риск того, что принятое тобой решение не окажется верным для тех, кому ты вот так незнамо дела помочь решил. Это будет называться медвежьей услугой.
  • Как настроить Git для работы с Си/Си++?

    Filipp42 , и вот же интересно, почему тебе задано сделать то, с чем тебя не обучили работать?
  • Как сделать static struct in static class (C++)?

    @MarkusD Куратор тега C++
    Adamos, зло - это неумелое использование или использование без понимания сути используемого.
    "Дьявол начинается с пены на губах ангела, вступившего в бой за святое правое дело" © Григорий Померанц.
    Подумай над этими словами.

    Acaunt, даже если они у тебя будут спрятаны в классе, но являются статическими, они все равно глобальные.
    И тем не менее, мой вопрос к тебе остается открытым. Плюсом будет еще один вопрос: зачем тебе вообще такие глобальные переменные?
  • Как сделать static struct in static class (C++)?

    @MarkusD Куратор тега C++
    Acaunt , а зачем тебе это все, когда есть namespace?
  • Как сделать обработчик коллизий в OpenGL?

    MrakLula, а это очень легко. Конкретную я советовать не буду, т.к. коллизии всегда сам считал, а физический движок тебе явно пока еще не нужен.
    Идем на гитхаб и смотрим тему коллизий для C++ (+ еще одна ссылка). Выбор там очень большой, а сориентироваться помогут списки замечательных библиотек.
    В пересечении этих двух списков спокойно можно найти подходящую тебе библиотеку. Это проще простого по сравнению с процессом встраивания и началом использования библиотеки.

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

    После встраивания кода библиотеки тебе нужно будет понять ее API. Не всякая библиотека предлагает документацию по своим интерфейсам. А для документированных библиотек чаще получается что документация не соответствует выбранной тобой версии кода. Поэтому библиотеку всегда нужно изучать и всегда нужно понимать методику работы с ней. А для этого нужно много практики. Нельзя просто взять, встроить чужой код и сразу начать им пользоваться, такого не бывает.
  • Вопрос по оформлению кода C++?

    @MarkusD Куратор тега C++
    Acaunt, я тебе в качестве еще одного источника информации, и в подкрепление своих слов, подскажу вот такую книгу еще.
  • Можно ли создать пустую структуру, а потом её заполнить внутри функции?

    @MarkusD Куратор тега C++
    Acaunt, вот смотри. Если человек не может в тезисах изложить решаемую проблему или описать работу своего кода, он не является программистом. Тогда это просто наборщик текста, машинист-наборщик по старинке.
    Тебе нужно учиться работать над описанием своих действий.

    В коде у тебя есть глобальная переменная date с типом структуры Date. Эта глобальная переменная неявным образом инициализируется статической функцией Core::get_system_parameters, которая использует Config::search_str для инициализации полей переменной date.
    Вот это все нужно уметь проговаривать для других людей.

    Твоя проблема состоит в том, что тебе неудобно два раза указывать имена полей структуры Date. А удобно ли тебе указывать эти же имена полей еще десятки раз там, где ты ими пользуешься? Не смущает ли тебя что эти поля везде модифицируемые, т.к. date не константна? Не беспокоит ли тебя то, что в результате get_system_parameters(); переменная date внезапно становится инициализированной и это вообще никак не описано в имени функции? Слово get в префиксе функции сразу говорит о том, что функция является аксессором, в частности - геттером и возвращает инициализированное значение, но у тебя слева от get_system_parameters(); нет присвоения, тебе это странным не кажется?

    На правах ответа на твой вопрос. Структура Date у тебя является агрегатной и для нее доступна агрегатная инициализация.
    return {
    	Config::search_str("title"),
    	Config::search_bool("fullskreen"),
    	Config::search_bool("window_mode"),
    	Config::search_int("width"),
    	Config::search_int("height"),
    	Config::search_int("render_API")
    };


    Но лучше бы тебе сделать все иначе. Конфигурация у тебя должна быть константной, инициализироваться явно и доступной она должна быть строго определенным образом.
    const Date& Core::get_system_parameters() {
    	static const Date date{
    		Config::search_str("title"),
    		Config::search_bool("fullskreen"),
    		Config::search_bool("window_mode"),
    		Config::search_int("width"),
    		Config::search_int("height"),
    		Config::search_int("render_API")
    	};
    	
    	return date;
    }

    И для чтения конфигурации всегда использовать только Core::get_system_parameters().
  • Можно ли создать пустую структуру, а потом её заполнить внутри функции?

    @MarkusD Куратор тега C++
    Acaunt
    я не хочу по 2 раза писать одни и те же переменые в структуре объявляя их

    А почему у тебя возникла сама проблема писать одни и те же переменные в структуре?

    Я тебя еще немного не понимаю, у тебя терминология отличается от стандарта. Давай, я опишу тебе термины, а ты переформулируешь в этих терминах свой текст из цитаты.
    // Определение структуры `Date`.
    struct Date {
    	int a; // Определение поля `a` в структуре `Date`.
    };
    
    // Определение глобальной переменной `date` типа `Date`.
    Date date;
    
    // Определение глобальной процедуры `get_parametrs`.
    void get_parametrs(){
    	// Полю `a` глобальной переменной `date` присваивается значение `5`.
    	date.a = 5;
    }

    Все пользователи C++ оперируют терминами объявления и определения, переменной, константы и поля, глобальной функции, статической функции и метода, и так далее. Тебя будут правильно понимать если ты будешь оперировать теми же терминами, что и все остальные.
  • Можно ли создать пустую структуру, а потом её заполнить внутри функции?

    @MarkusD Куратор тега C++
    Acaunt , а для чего тебе нужно именно такое поведение в коде?
    Сейчас в вопросе у тебя видно что ты хочешь через такое поведение решить какую-то задачу. Мне интересно узнать, какую задачу ты хочешь решить таким образом.
  • Почему может быть ошибка во время компиляции?

    @MarkusD Куратор тега C++
    impelix, тебе ведь не описать эту строку предложили, а сделать этот код более понятным. Сейчас код в этой строке вызывает вопросы.
    Оператор присвоения возвращает результат присвоения. Это то поведение, которого ты ожидаешь от кода? Оно не всегда является очевидным.
    Почему бы не переписать эту строку так?
    parent[num] = findMN(parent[num]);
    return parent[num];

    И не стоит опасаться за двойную индексацию. Оптимизатор C++ такие места видит лучше тебя и оптимизирует полностью самостоятельно. Особенно-то при том, что изначально ты итак все сделал через двойную индексацию.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322,
    А разве в случае prvalue трейты std::remove_reference+std::remove_const не сделают ничего ?

    Об этом я и написал. Они ничего и не сделают. Даже не отмаркируют фактическое нарушение контракта (нужна константность, нужна ссылка). Т.е. может быть сейчас они и сделают что-то что тебе нужно, но так будет не всегда, за то они всегда будут позволять трансляцию дальше. В этом плане std::decay даже понятнее, т.к. его семантика говорит снять все что есть. А если ничего нет, то и снимать нечего. Тут нужно видеть разницу между "снять все что есть" и "снять именно это".

    std::decay удобен своей семантикой. Читаешь и сразу понимаешь что происходит с переданным типом.
    Связку из двух-трех трейтов в одной строке читать уже сложнее. Пусть эта связка и является прямой заменой std::decay. Преобразование к указателю - незначительное зло, с которым даже можно успешно жить.
    На деле мне ни разу не пришлось пересекать тип массива статической длины и std::decay, они всегда идут разными путями.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, пагубное есть. Через такие конструкции ты выражаешь определенные ожидания от пользователя твоего шаблона. Даже если пользователь - ты сам.
    Через подобные объявления ты создаешь контакт. Но кто следит за его выполнением? Тут ведь нет ни одного ограничения. В иной ситуации тебе в test первым параметром зайдет внезапно prvalue, для которого T выведется в чистый тип. Трансляция даже не остановится, т.к. std::remove_reference и std::remove_const созданы так, чтобы не замечать отсутствия того, что они призваны удалять.
    И в какой-то неожиданной ситуации это все, в конечном итоге, однажды рухнет.

    Честно, проще взять второй шаблонный параметр, а в теле функции уже сделать static_assert на соответствие типов. И в этом месте яб именно std::decay использовал. Так твой контракт получит механизм соблюдения.
    В C++20 так и вовсе можно использовать requires для явного определения контракта.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, сейчас ты описал Object Pool. Это другое.
    Memory Pool полноценно создает и уничтожает объекты, контролируя только выделенную под них память в своих страницах. Именно пулы памяти используются для дешевого выделения больших количеств объектов с полиморфизмом. Очень часто пул памяти выступает источником памяти для абстрактной фабрики.
    При этом для пула памяти характерно именно то, что в ячейку странички по выравниванию и размеру входит объект любого типа из полиморфной иерархии. Т.е. все как ты и описал в своем вопросе.