Задать вопрос
  • Проектирование и архитектура приложений?

    Думаю, еще стоит дать пояснение по поводу применения конверта. В GoF конверт и мост - это один примитив проектирования. Но на деле любой примитив - это инструмент, которым можно пользоваться по-разному.

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

    Кирилл Горелов, сервис локатор предлагаю сделать только если нужно. Если диспетчеров нужно несколько, я для них предлагаю завести сервис локатор.

    Я бы не сказал что вся магия творится в диспетчере. Это может прозвучать как будто диспетчер - это god object, который делает буквально все. В моем предложении диспетчер выполняет очень маленькую функцию. Но для читателя кода, на этапе передачи исключения диспетчеру все и заканчивается. Дальше считается что отчет об исключении отослан.

    Примитив диспетчера отличается тем, что не делает, а только перенаправляет в правильный канал.
    Внутри у диспетчера может лежать фабрика конвертов и реестр почтовых ящиков. Вот все инструменты, что ему нужны для работы.
    Диспетчеру дают исключение и говорят: "Направь адресату". Он толкает исключение в фабрику, получает от фабрики конверт и посещает все почтовые ящики в своем реестре с этим конвертом.
    Тут перенаправление в правильный канал получается за счет посещения почтовых ящиков.
  • Хранение настроек IOT железа. Что взять за идею или библиотеку?

    @MarkusD Куратор тега C++
    Александр Воронин , для начала давай убедимся что C тебе действительно нужен.
    И для AVR, и для STM, и для ESP уже давно есть компиляторы языка C++ даже с поддержкой C++17.
    Какие у тебя есть веские доводы оставлять совместимость своего кода с каким-либо стандартом C?
  • Проектирование и архитектура приложений?

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

    @MarkusD Куратор тега C++
    Кирилл Игнатьев , ты лучше расскажи, почему ты думаешь что в твоем коде нет функции? :)
  • Проектирование и архитектура приложений?

    Кирилл Горелов , дай-ка я тебе сразу покажу бойлерплейт в твоем подходе.
    Logger.log('старт скрипта') - это что, каждую функцию так начинать и заканчивать?
    Logger.log('Нормально все прошло идем дальше') - это ты в каждом удобном месте писать хочешь?

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

    Посмотри как такие декораторы пишутся и как работают. Например так (мной не очень любимая форма), или вот так, что мне нравится больше. И про контекстные менеджеры тоже примеры есть.
    И исключения в таком стиле обрабатывать удобнее. Проверено.

    Безусловно, Logger.log прямо так брать и списывать не стоит, он тоже полезный и им тоже важно пользоваться. Но не для трассировки.
  • Как работают с git diff-ами 3d-ассетов в GameDev?

    Вадим Ремин, это смотря как представлена сцена и какие возможности по совместному редактированию есть у инструментов.
    Например, для Wakfu Online был сделан специальный редактор для совместного заполнения локации. При этом, локальные редакторы у дизайнеров являются простыми сетевыми клиентами к БД локаций. И этот инструмент действительно работает.
    В моем личном опыте есть реализация сцены в виде построчного json. Каждый элемент - одна строчка. Формат - текстовый. Конфликты, слияния и диффы делаются на ура. Проблем тоже нет, кроме проблемы расползания строчек по вертикали и общего размера файла.
    А с бинарными форматами все однозначно: пока один сотрудник его не положил на место, второй его взять не может.
  • Как исправить ошибку в qt?

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

    @MarkusD Куратор тега C++
    BobJonstone, Mercury13, не стоит в этом месте использовать reinterpret_cast. Это выстрел себе в ногу.
    reinterpret_castработает очень коварно:
    Unlike static_cast, but like const_cast, the reinterpret_cast expression does not compile to any CPU instructions... It is purely a compile-time directive which instructs the compiler to treat expression as if it had the type new_type.


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

    @MarkusD Куратор тега C++
    Насколько это правильно?

    Зависит от того, какую задачу ты решаешь.
    Я скажу - все это неправильно. Самая частая ошибка человека в том, что он описывает не саму проблему, а то, как он эту неописанную проблему хочет решать.
    Я пока еще не понимаю что ты хочешь сделать, сейчас еще рано говорить о том, как ты хочешь это сделать.
  • I want to find the time it will take to sort through an insertion sort in c++?

    @MarkusD Куратор тега C++
    Miltonc, прошу обратить внимание на пункт 3.6 в правилах.
    Пользователь обязан соблюдать нормы и правила Русского языка. Это относится и к кривым автоматизированным переводам.
  • Как передавать много сообщений через Socket?

    @MarkusD Куратор тега C++
    maaGames, значит TCP, стримминговый протокол. Тогда в буфере приема у тебя и правда сколько фрагментов сообщений накапало на момент сигнала от poll, сколько ты и вычитаешь из сокета в промежуточный буфер. TCP оперирует фрагментами малого размера, которые он получает из записанных в сокет данных. При этом TCP считает что ты пишешь потоком и хочешь читать все доставленные в сокет фрагменты как поток данных.

    Для чтения из TCP сокета обычно используют циклический буфер. Я у тебя про него немного выше спрашивал.
    Общая концепция такова, что ты в циклический буфер читаешь до момента завершения вычитки всего сообщения, дальше это сообщение уже отдается на разбор, а все, что было вычитано из сокета сверх тела текущего сообщения, остается в буфере и ждет следующей сессии по вычитке из сокета. Размер циклического буфера при этом желательно иметь намного больше чем размер самого большого сообщения, чтобы не останавливать операцию чтения и не блокировать чтение операцией разбора сообщения.
  • Как передавать много сообщений через Socket?

    @MarkusD Куратор тега C++
    maaGames, ясно. Тут и правда уже без кода не разобраться. :)
    У тебя эти сокеты, кстати, какой сетевой протокол используют?
  • Как передавать много сообщений через Socket?

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

    Я, пожалуй, двусмысленно выразился про блокируемость. Я имею в виду вот какой момент. Ты ведь сообщение пишешь участками, по одному полю данных. SocketOutputStream не собирает твои данные в единый бинарный буфер, а сразу пишет их в сокет. Это дает волю кому угодно вклиниться из другого потока в этот сокет между операциями записи в твоем текущем потоке. Т.е. транзакция записи сообщения может быть легко нарушена.
    flush при этом - это барьер синхронизации между исполнением твоего кода и очисткой конвейера операций устройства (в самом устройстве). В случае блокируемых сокетов flush - фиктивная штука.

    Попробуй, как минимум для проверки, писать сообщения в TLS буффер по одному, а далее передавать уже этот TLS буффер в SocketOutputStream. Т.е. передавай на запись в сокет не сообщение, а буфер, куда сообщение сериализовано.

    зы
    Я не заметил первое твое сообщение. Понимаешь, то, что ты видишь в буфере приема явно говорит о состоянии гонки на стороне отправки. У тебя сообщения телами пересекаются в буфере. Новый magic number в буфере приема не появляется потому что он был записан раньше чем продолжилась запись предыдущего пакета.
  • Как передавать много сообщений через Socket?

    @MarkusD Куратор тега C++
    Коротко, у тебя тут на лицо race condition. В одно и то же горло лить пытаются сразу несколько источников. Горло - это сокет. Источники - это SocketOutputStream. Они не выстраиваются в очередь и не ждут завершения транзакции записи пакета.
    Пакет в сокет надо писать сразу и весь, одним вызовом функции записи. Или блокировать сокет на период записи пакета от прочих попыток записи.

    Если хочешь, могу всё описать конкретнее в рамках ответа.

    К слову, сообщения в несколько мегабайт - это много. У тебя циклический буфер на сколько поставлен? Он не лопнет мегабайтами вычитывать? Ты DoS по оперативной памяти на сервере не боишься?
  • Как сделать конкатенацию в функции system()?

    D9koder, все дело в том, что сам вопрос у тебя сводится к ознакомлению с документацией. :)
    Тебе стоит изучить заголовок string.h из стандартной библиотеки C.
    Язык C максимально прост в этом месте. Тебе требуется самостоятельно осуществить все операции по склейке строк.
  • Как сделать конкатенацию в функции system()?

    D9koder, тебе все-таки стоит вставить код текстом, в теге <code>, чтобы люди понимали твой вопрос могли на него ответить. :)
  • Vector в классе?

    @MarkusD Куратор тега C++
    Данил, ты все еще никак не ответил на мои вопросы.
    Даже в примере WinPooh32 происходит инициализация вектора. Важно понимать, что именно ты хочешь получить от std::vector<int>{10}: вектор с одним элементом или с десятью?

    Если у тебя имеются ошибки компиляции, тебе стоит первыми выписать именно их. Желательно весть твой код оформить так, чтобы в комментариях к строчкам было видно, какие у тебя на этих строчках ошибки.

    Пункт 3.8 правил Тостера запрещает использовать изображения для демонстрации кода. Используй тег <code> для демонстрации своего кода.
  • Как сделать конкатенацию в функции system()?

    D9koder , прошу обратить внимание на правила Тостера, в особенности на пункты 3.8 и 3.1.
    Код необходимо указывать в теге <code>, скриншты с кодом никому не нужны.
    Теги стоит указывать только максимально конкретизирующие твой вопрос. Тебе незачем писать язык в вопросе, когда для этого языка заведен отдельный тег.