Задать вопрос
  • Восходящее преобразование массива производного класса к родительскому?

    @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>, скриншты с кодом никому не нужны.
    Теги стоит указывать только максимально конкретизирующие твой вопрос. Тебе незачем писать язык в вопросе, когда для этого языка заведен отдельный тег.
  • Vector в классе?

    @MarkusD Куратор тега C++
    Данил, я готов поспорить что не C++14 точно.
    Рекомендую дать ответы на все мои вопросы.
  • Vector в классе?

    @MarkusD Куратор тега C++
    Данил, видимо, потому что ты собираешь код в стандарте C++03 или более раннем.
    Что означает "работает просто vector arr(10)"? Работать код может самым различным способом, даже неправильным. Чтобы понять тебя, от тебя нужны детали и пояснения твоей терминологии.
  • Vector в классе?

    @MarkusD Куратор тега C++
    Данил , твой вопрос требует конкретизации.
    Какого поведения ты ожидаешь от конструкции vector<int> arr(10)?
    Какой стандарт C++ ты используешь для сборки этого кода?
    Сколько элементов ты хочешь видеть в векторе после конструирования экземпляра Stack?
  • Можете помочь решить небольшую задачу на С++?

    @MarkusD Куратор тега C++
    edward_freedom , плюсик в карму за нормальные имена. :)
  • Могу ли я связать два автономных скрипта?

    colcefer , прошу обратить внимание на П3.1 правил Тостера.
    Пользователь обязан указывать только те теги, которые имеют непосредственное отношение к вопросу, и выбирать только максимально конкретизирующие вопрос теги. Теги C++ и JavaScript являются лишними для данного вопроса.
  • Как написать второй operator= в C++?

    @MarkusD Куратор тега C++
    Mercury13, тогда, минимально, это операция применения (apply) или, что ближе всего, операция переопределения - override.
    Смотри как много непонимания создается от использования всего одного слова не по месту. :)

    По своей сути компилятор автоматом для тебя только операторы копирования и перемещения может сделать. Остальное тебе надо ему объяснить.
    У тебя там class OverrideableInt, поле overrideValue является приватным. Значит тебе не просто саму stealDataFrom надо написать, но еще и объявление дружественности написать.

    Кажется я начинаю понимать суть твоей затеи. Похоже что таких OverrideableXYN у тебя много, они все разные и являются составными частями модели записи в базе. Потом ты хочешь из одной записи в базе перетянуть только оверрайды значений.
    У меня есть архитектурное решение для тебя. Коротко - это тебе для сложных случаев надо создать список посещения и, собственно, steal выполнять через визитера по двум спискам. Вроде такого.
    dest_record.Visit( source_record, ApplyOverriddenValue );

    Могу расписать немного подробнее, если надо.
  • Как написать второй operator= в C++?

    @MarkusD Куратор тега C++
    Mercury13, погоди, а что такое "создаём идентичный объект"?
    Почему после перемещения from в to последний не будет идентичен?
    А почему вектор откажет?

    Семантика перемещения говорит переместить состояние правого операнда в левый, оставив правый после перемещения в консистентном состоянии и сохраняя инвариант своего типа.

    Я, в таком случае, совсем не понимаю смысл слова steal. :)
    Steal - украсть. Украсть - забрать что-то у кого-то. Забирая что-то, мы это что-то куда-то перемещаем. Т.е. мы выполняем семантику перемещения, но называем это все кражей. Так еще куда ни шло, хоть вводит еще один синоним уже понятной операции. Но вот если steal ничего не крадет, то это уже очень странно.