• Как настроить 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 полноценно создает и уничтожает объекты, контролируя только выделенную под них память в своих страницах. Именно пулы памяти используются для дешевого выделения больших количеств объектов с полиморфизмом. Очень часто пул памяти выступает источником памяти для абстрактной фабрики.
    При этом для пула памяти характерно именно то, что в ячейку странички по выравниванию и размеру входит объект любого типа из полиморфной иерархии. Т.е. все как ты и описал в своем вопросе.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, UE не показатель хорошего кода. Совсем не показатель. Даже наоборот, хоть в целом инструмент и пользуется популярностью, в деталях же он кишит совершенно неподходящими к месту решениями.
    Они там очень часто пишут шиворот-навыворот, буквально не оставляя никакой возможности заимствовать их код как есть.

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

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

    К тебе вопрос. Что такое "боле идиоматичный" способ?
    Первый пример у тебя почти-почти реализует шаблон проектирования. В это время второй пример у тебя демонстрирует решение бытовой потребности в "стиле сишечки". Там у тебя не ** должен быть, а std::vector на должный умный указатель.
    В этом контексте мне не понятно, о чем именно ты спрашиваешь. Ясность должно внести толкование используемого тобой термина.
  • Как преобразовывать тип данных?

    @MarkusD Куратор тега C++
    War4 , тебе следует переместить код в тело вопроса (П5.7 регламента) и оформить его по правилам (П3.8 регламента).
    Опиши в теле вопроса проблему так, чтобы ее можно было понять (П3.2 регламента).
  • Не получается вернуть строку. Как исправить?

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

    @MarkusD Куратор тега C++
    Сергей Мокин , П3.8 регламента работы сервиса.
    Тебе следует оформить код как следует.
  • Почему MSVC выдает ошибку что размер массива должен быть константным выражением, а Clang/GCC компилирует без ошибок?

    @MarkusD Куратор тега C++
    colorname, чтобы дать тебе объяснение, от тебя требуются настройки трансляции для clang и GCC.
    При этом учитывать стоит то, что GCC действительно позволяет VLA в C++, что нарушает стандарт. Поэтому в GCC у тебя просто не будет этой ошибки.
  • Почему MSVC выдает ошибку что размер массива должен быть константным выражением, а Clang/GCC компилирует без ошибок?

    @MarkusD Куратор тега C++
    colorname , ты зря поставил лайк на другой ответ. Он не соответствует действительности.
    А этот ответ является и правильным, и вопрос твой тоже решает.
    Выражение int value = 12; должно иметь характеристику времени компиляции. В ином случае контекстом вызова scale в выражении scale(value) будет контекст времени исполнения, а не контекст времени компиляции.
  • Почему VS22 указывает что функция якобы не определена?

    colorname,
    И кто решил что это именно сбой?

    Я знаю стандарт C++ и я вижу что здесь именно сбой студии потому что студия должна корректно отображать все, что написано в рамках стандарта. А у тебя вариантов много, собственно, от незнания.
    Задавая подобные вопросы, ты должен понимать что задаешь их человеку, который пишет отчеты об ошибках в трансляторах C++ и разработчики трансляторов эти ошибки исправляют.

    Ты задал свой вопрос здесь и тебя перенаправили к разработчикам продукта. В чем проблема? Твой дальнейший порядок действий - это найти или создать у разработчиков этот вопрос, а ссылку на него прикрепить здесь в качестве решения этого вопроса. Подобные вопросы они решают довольно быстро.