• Как убрать непечатаемые символы и пробелы из строки?

    @MarkusD Куратор тега C++
    sanek2005 , все зависит от того, что у тебя за код и как именно эти символы нарушают его работу.
  • Есть ли в C++ функция преобразующая текст в байты и байты в текст по заданной кодировке?

    @MarkusD Куратор тега C++
    Wataru, а вот изюминка в том, что на замену ему пока ничего столь же удобного не придумали.
    Лично мне пришлось перестроить код на использование функций из C: mbrtoc16, mbrtoc32, c16rtomb и c32rtomb. И это потому что, снова, не все реализации стандартной библиотеки C++ реализуют эти же функции. Многие разработчики приходят к такому же решению при отказе от codecvt. Иные пользуются тем же ICU и про codecvt даже не вспоминали.
  • Есть ли в C++ функция преобразующая текст в байты и байты в текст по заданной кодировке?

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

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

    Выражение в C++ всегда завершается символом ;, который находится в конце строки. Люди ждут выражений не более чем в одну строчку. Когда в конце строки находится не ;, код снова начинает сбивать читателя с толку. В самом крайнем случае допускается разбивка арифметических выражений на несколько строк. Да и то, на ревью такой код с вероятностью 80% потребуют переформулировать в пояснительные константы. Больших арифметических выражений в коде тоже быть не должно.

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

    Тебе определенно стоит ознакомиться с рекомендациями по стилю кода, например: [1], [2], [3], [4], [5].
    Еще тебе обязательно стоит изучить книгу Д. Босуэлла "Читаемый код". Там описывается много способов упрощения жизни себе и другим людям.
  • Как передавать сообщения в неактивное (свёрнутое) окно?

    @MarkusD Куратор тега C++
    Ledane , П4.1 регламента работы сервиса.
    4. После размещения вопроса пользователю запрещается осуществлять:
    4.1. Дублирование вопроса, который уже размещался на страницах Сервиса. В том числе и в случае, если вопрос был удалён модератором, или на вопрос не был дан ответ (т.е. категорически запрещается дублирование вопроса с целью повторного привлечения к нему внимания).
  • Какой из двух кодов будет более читабельным и удобным для использования?

    @MarkusD Куратор тега C++
    have_a_nice_day13, все просто. Тебя не поймут другие люди. При чем, не поймут они тебя именно в плохом смысле, они будут на тебя очень злы. Это потому что ты таким кодом заставляешь их напрягаться и вчитываться для того чтобы найти интересующую их переменную.
    Наверное ты невнимательно прочитал в первый раз, я повторю еще раз. Правило 0 при написании кода - не создавать проблем для его чтения.

    Найди в этом коде переменную impression.
    float intension, empation, insignion, imposion;
    int impresumption, impetition, inversion, illustration;
    bool illusion, impretendion, imperception;

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

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

    @MarkusD Куратор тега C++
    have_a_nice_day13, кода мало, тебе нужно еще объяснить все написанное словами. В чем конкретно смысл существования каждого типа, каждого поля, каждой функции. Если ты не можешь связно сформулировать смысл существования кода, просто сотри его. Код, который ты не можешь объяснить, существовать не должен.

    Без этого объяснения я могу посмотреть на этот код только с т.з. синтаксиса и общего восприятия.
    Пространство имен - это неплохо. Зачем оно создано? Что оно содержит внутри себя? Почему оно называется абсолютно безликим словом client, которое ничего не выражает?
    struct data_t - абсолютно никак не объясняет смысл своего существования. Слово Data не выражает ничего, оно просто говорит что внутри какой-то бессвязный белый шум из байтиков. Почему для определения типа выбрано слово struct? Почему не class?
    struct authorization_t - словом Authorization обозначают данные уже авторизовавшегося пользователя, которому уже присвоен идентификатор сессии. У тебя в этой структуре записаны поля, которые другими людьми оформляются в термин Authentication. Разница между этими терминами даже близко не позволяет один с другим сравнивать.
    const char* login = nullptr, *password = nullptr; - через запятую никогда не пишем. Каждое поле должно быть легко читаемо на своей отдельной строке. А вот таким определением полей через запятую ты ничего не добиваешься, кроме как только усложнения чтения кода. Правило 0 при написании кода - не создавать проблем для его чтения.
    const char* login - константностью данных управлять нужно не так. Именно объекты типа struct authorization_t должны наделяться свойством константности там, где это требуется. Состояние же этих объектов константным делать просто незачем.
    const char* login ... size_t login_sz - при инициализации по умолчанию поле } authorization; имеет неконсистентное и алогичное состояние. Более того, такой набор полей нельзя отнести к коду на языке C++. Эта структура написана на C. Весь набор полей нужно изменить на два поля с типом std::string если ты хочешь писать на C++.
    } authorization; - от кого ты прячешь этот код? Определение поля должно быть легко читаемым. Сейчас оно абсолютно нечитаемое. Чтобы найти это поле глазами, требуется много непозволительных для этого занятия усилий. И, опять же, это не Authorization, а Authentication. С моей т.з. такого поля в этом месте существовать вообще не должно.
    const char* mac = nullptr, *proc_id = nullptr, *mbios = nullptr;
    - все так же, через запятую поля никогда не определяем. Более того, тут уже пошли очень странные нечитаемые и непонятные имена. mbios - что это, акроним или именование в стиле СовКомПоМорДе (Советский Комитет По Морским Делам)? Такие имена невозможно прочитать, они не отражают смысла своего существования. Почему в authorization_t для полей с типом const char* есть семантическая пара size_t, а тут - нет? Все эти поля нужно заменить на std::string.

    У тебя буквально каждая строчка требует кардинальных исправлений. Считай этот разбор бесплатной демоверсией. Больше я на него своего времени потратить не могу.

    в моем проекте практически все классы объявлены глобально. потому что вся программа в бесконечном цикле

    Наличие статически определенных объектов оправдано может быть только требованиями соблюдения стандарта MISRA при разработке встраиваемых систем. В ином случае все статически определенные объекты должны иметь доказательство своей необходимости. Наличие бесконечного цикла не обосновывает необходимость статического размещения каких-либо данных.
  • Что должен знать Core/Системный программист игрового движка?

    approximate solution,
    Комбинаторика, теория вероятностей, графы, матрицы, дискретная оптимизация

    И ничего из этого не относится к разделу Математического Анализа. Если коротко.
    И требования не зависят от того, 2D или 3D движок товарищ собрался делать.
  • Какой из двух кодов будет более читабельным и удобным для использования?

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

    Я так понимаю, это вопросительное предложение?

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

    владел только той информацией, что - _t = typedef

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

    @MarkusD Куратор тега C++
    edward_freedom, про Венгерскую нотацию ты написал верно. Она используется для передачи контекста и, во многом, является пережитком прошлого и просто избыточна.
    Суффикс _t является частью соглашения об именовании.

    А вот have_a_nice_day13 в своих словах не прав. К typedef суффикс отношения не имеет.
  • Как назвать такую конструкцию?

    Владимир Коротенко, ну смотри. По объему изложенного я пока вижу что в ответе ты не заинтересован, поэтому просто предлагаю два самых очевидных варианта.
    Первый - это реестр [?]. Это более вероятно, т.к. реестры работают с +/- подобным уровнем данных. Быть может это простой реестр каких-то там запросов.
    Второй - это локатор сервисов [?]. Это менее вероятно. Разве только если сервисами ты назовешь кэширующие источники этих запросов.
    Но это у тебя так же может быть и обычный кэш.

    С учетом этого твоего комментария я могу сказать что тебе лучше переработать архитектуру этого кода и применить локатор сервисов.
  • Как правильно оформить шаблон функции в классе с++?

    @MarkusD Куратор тега C++
    KeyDel , что такое map_type и в каком именно коде при вызове addData транслятор выдает ошибку?
  • Почему C/C++ проекты очень долго компилируются?

    @MarkusD Куратор тега C++
    zeuss56, а... конкурентная сборка. :)
    Ктож мог подумать что у тебя она не включена. Хорошо что теперь она работает. Я, в свое время и давным давно, тоже не сразу про нее узнал и транслировался по 30-40 минут. Когда указал "-j" на все ядра, время полной сборки того проекта сократилось до 3-5 минут.

    Я могу еще такое рассказать. На время трансляции сильно влияет и сам код. Например, обилие макросов в коде очень сильно повышает время трансляции. Буквально катастрофически. На моем богатом опыте, увеличение времени от обилия макросов достигает +40..60% общего времени трансляции. Неправильное использование форм директивы #include может привести к увеличению времени трансляции до +20%. Т.н. "include guard"-ы [?] спокойно увеличивают время трансляции до +5..10%. Любая эвристика с логарифмической трудоемкостью в шаблонах и при обильном использовании приводит к увеличению времени трансляции до +8%.
    Факторов увеличения времени трансляции C++ кода вообще довольно много. Поэтому большие проекты на C++ обычно собираются порядка часа или двух. Даже при условии распределенной сборки.
    Тут главное - это просто понимать неизбежность последствий использования тех или иных конструкций языка.
  • Как назвать такую конструкцию?

    Владимир Коротенко , это зависит от того, какую функциональность эти самые POCO объекты выполняют и как организован доступ к ним. Даже если бы ты хотел оформить это синглтоном, синглтоном оно бы не называлось, т.к. Singleton - это шаблон уровня дизайна, а не прикладного уровня.
  • Как слепить пять слов в одно через пробелы?

    @MarkusD Куратор тега C++
    Данил Васькевич, код strcat_s(res, 100+strlen(sentense1), sentense1);.
    Расскажи своими словами и максимально детально, что именно делается в этом коде.
  • Как я могу заблокировать getch() из ncurses на несколько секунд?

    @MarkusD Куратор тега C++
    Trimsky , ответ на этот вопрос ты всегда можешь узнать из документации функции.
  • Как в шаблоне Си++ отличить константный буфер от строкового литерала?

    @MarkusD Куратор тега C++
    Mercury13, а, понятно. Да не, с decltype в этом месте все в порядке.
    Просто я изначально не совсем понял что под константным буфером понимается простой статически выделенный массив.
    Собственно, с этим и есть некоторая проблема касательно твоего вопроса. Ведь строковой литерал имеет тип const char[N]. Т.е. после получения характеристики ODR-used и размещения в статической памяти это будет точно такой же статически выделенный массив константных символов.

    Их можно различить только на этапе компиляции, чисто теоретически. Но и там литерал не будет отличим от constexpr статически выделенного массива.
    Можно попробовать покопаться вокруг вот такого хака. Хоть он и на C, возможно из этого можно вынести какие-нибудь идеи для C++ и constexpr.

    Готового решения у меня, откровенно, нет. Но я подумаю над этим вопросом. :)
  • Как в шаблоне Си++ отличить константный буфер от строкового литерала?

    @MarkusD Куратор тега C++
    Mercury13 , давай тут для начала с терминологией разберемся.
    Ради оптимизации на обычных строковых литералах (первый юнит-тест) я пошёл на неочевидную работу на константных буферах (второй юнит-тест).

    str::concat("alpha\0\0", "bravo"sv)
    Вот тут используется строковой литерал "alpha\0\0" и строковой литерал "bravo" с приведением его к std::string_view. Верно я ведь понимаю?

    str::concat(const_cast<const decltype (a)&>(a), b)
    a ты называешь константным буфером? Я правильно понимаю?
  • Как уменьшить загрузку процессора при свернутом окне программы?

    @MarkusD Куратор тега C++
    Glace , а где у тебя в вопросе твой код цикла обработки сообщений и, собственно, та самая on_message?