Задать вопрос
  • Хороший ли это пример паттерна mediator?

    zlodiak , посредник предоставляет доступ одной сущности к функциональности другой сущности через свой интерфейс. В твоем коде это реализовано? Я не вижу.
    Медиаторов может быть сколько угодно, на связность кода это никак не виляет, т.к. все замкнуто на интерфейсе медиатора и только медиатор является элементом связности такого кода.

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

    polger
    и в HEX-редакторе вручную слил секцию .idata с .text и поправил адреса. И всё работает.

    Нет, не работает. Если пропадет важная секция (.data/.rdata/.reloc/...), приложение невозможно будет запустить. Если у тебя что-то запустилось в каком-то виде -это еще не повод для утверждений. Грубо говоря ты данные пустил с правами на исполнение, это так себе перспективочка.
    Сама VS не дает прямого доступа к формированию секций PE формата. Это не задача студии. Ты можешь только заказать довольно ограниченный набор операций линкера.
    Попробуй почитать формат PE, там все довольно понятно и однозначно.
  • Почему в 1 случае char* создается без const, а в 2 только с const?

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

    polger , дело в том, что у каждой секции свой смысл и свои разрешения доступа к памяти.
    В секции .text лежит код. Код отображается в память процесса для исполнения. Над содержимым секции перед исполнением проводится ряд манипуляций.
    В секции .idata лежит таблица импорта символов. В секции .edata - экспорта символов. А в секции .rdata - память неизменных данных с разрешением доступа только на чтение.
    Посмотри что из себя представляет секция .idata. Лично я не представляю, помимо ограничения прав доступа, как загрузчик PE будет работать со слитыми вместе data и text секциями. Так же я не представляю, где в процессе слияния секций может быть экономия места.
  • Как слить все секции PE файла в одну?

    polger
    Как слить всё в одну секцию?

    Зачем? Ты понимаешь что это будет означать и какие риски это породит на этапе запуска такого файла?
  • Как запустить код на C из perl?

    Ася
    Как запустить скрипт на C из perl?

    Для начала нужно найти интерпретатор языка C, выполненный на языке Perl. И, наконец, взять исходные коды на языке C и запустить их интерпретацию через интерпретатор языка C на языке Perl, в рамках твоего проекта.
    Думаю, это самый верный метод с учетом деталей постановки твоей задачи. :)
  • Как упростить сравнение 4 чисел с помощью if?

    Ruslan Malkhozov , а для чего надо оставить все три if? Какая у них цель на самом деле?
  • Зачем ставить фигурные скобки после вызова метода?

    @MarkusD Куратор тега C++
    Vitaly , просто за тов. Толстый Лорри замечено пестрение больно ультимативными заявлениями на темы вкуса колбасных обрезков. В одном из вопросов пару лет назад он вполне спокойно назвал Джона Кармака идиотом на основании того что тот относит себя к const nazi.
    В данном случае я каюсь: я просто сагрился на очередной вяленький "больно ультиматум" и токсично повел себя. :)

    Между тем, Roman привел действительно хорошие ссылки.
    Дело в том, что управление областью видимости и точками декларации может быть эффективно использовано в рамках короткого и понятного кода. Особенно это касается корутин, лямбда-функций для асинхронной обработки или просто для всего пространства асинхронного исполнения. Важная особенность в том, что деструктор (с сайд эффектом) локального объекта будет вызван тогда, когда завершится блок, а конструктор - в начале.
    Плюс - стилистическое оформление. Мало кто знает про #pragma region и мало кто приветствует его наличие в коде. Мало кто знает про вложенные блоки и мало кто приветствует их в коде. Мало кто вообще любит работать над стилем изложения кода и мало кто приветствует эту работу.
  • Зачем ставить фигурные скобки после вызова метода?

    @MarkusD Куратор тега C++
    Толстый Лорри , так делать стоит и всегда. Это выглядит очевидно для тех кто знает стандарт, а польза прозрачно понятна. =)
  • Кириллические строки в с++?

    @MarkusD Куратор тега C++
    Юрий Есин , а можно на этом моменте поподробнее? Какие именно архитектуры накладывают свои ограничения? От каких именно констант типизации компилятора? Что такое "константы типизации компилятора"? От какой именно "самой" кодировки и что именно зависит?
    Ты, случайно, юикод с UTF-8 не путаешь?

    Тот же UTF-16, к примеру. Он по определению ну явно не может всего 2 байта в памяти держать)

    Какой минимальный размер символа UTF-16? Максимальный?
    Какой минимальный размер символа UTF-8? Максимальный?

    Просто такие нюансы должны быть очевидны и не вижу смысла в который раз расписывать все эти детали...

    Да, такие нюансы очевидны и должны быть широко известны. Суть моих вопросов в этом.
  • Кириллические строки в с++?

    @MarkusD Куратор тега C++
    Данил , какой именно компилятор тебе это выдает и при каких именно флагах сборки?
  • Как организовать взаимодействие php и с++?

    @MarkusD Куратор тега C++
    Александр , исходной информации мало.
    Что за php-скрипт? Что за программа на c++? Где они находятся, в пределах одной среды или в разных? Синхронное нужно взаимодействие или асинхронное? Зачем там json?
  • Что мне делать если я хочу стать разработчиком игр но не чего по этому не знаю?

    Alexandr668 , я думаю, прекрасным стартом для тебя будет обучение грамоте. Изучи родной язык. Грамотное изложение своих мыслей и грамотная постановка вопросов очень сильно помогают в процессе получения новых знаний.
    Я серьезно. Хорошо поставленную речь приятно слушать, хорошо написанное предложение приятно читать, на грамотно сформулированный вопрос приятно ответить.
    Потом лучше всего изучить язык чужеземный. Английский, например. А дальше вот тебе дорожная картаеще одна) для развития.
  • Как восстановить указатель на не первый базовый класс из неизвестного производного класса?

    @MarkusD Куратор тега C++
    DanyaFantomas , в твоем вопросе не видно кода. Описание не дает точного понимания проблемы.
    Пока складывается впечатление, будто тебе больно хочется бороться с ремаппингом памяти в следствии некорректного приведения типов. Так себе занятие.
    Приведи обоснование того, что функция , в которую передаётся указатель типа void*, может иметь право на жизнь в рамках твоего проекта.
  • Как можно вычислить максимальное и минимальное значение массива?

    @MarkusD Куратор тега C++
    Катя , да, все верно. :)
    В твоем первоначальном коде инициализация нулями переменных min и max все и портила.
    Если мой, или чей-либо еще, ответ тебе помог, не забывай отметить его как решение.
  • Массив структур в c++?

    @MarkusD Куратор тега C++
    Данил ,
    Выводит ошибку

    Какую ошибку выдает? Где у тебя в вопросе описание ошибки? Где у тебя в вопросе определение твоей структуры? Зачем в объявлении параметра arr присутствует слово struct? Зачем в объявлении arr присутствуют квадратные скобки?
  • Как можно вычислить максимальное и минимальное значение массива?

    @MarkusD Куратор тега C++
    Катя , а тип std::pair тебе пока ведь и не надо подробно понимать :)
    Общая его суть такова, что он просто несет в себе два значения - это же пара. В то же время std::tie принимает пару и достает ее значения в указанные переменные, т.е. буквально распаковывает пару. std::tie лучше пока тоже особо не изучать т.к. там на самом деле в основе лежит очень глубокий раздел метапрограммирования.
    Опуская тип пары и функцию распаковки этой пары можно сосредоточиться на том, что GetMinMax просто возвращает два значения - индекс минимального и индекс максимального значений в переданном массиве stream.

    Т.е. после того, как мы просмотрели все элементы массива через цикл for, мы ставим условие...

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

    Мы работаем логически: у нас две руки и лента с ячейками на столе перед нами. В левой руке - индекс минимального значения, в правой - индекс максимального. Глазами мы идем по ячейкам ленты слева-направо, останавливаясь на каждой ячейке отдельно. Смотрим на ячейку, запоминаем значение в ней, далее раскрываем левую руку и смотрим на ячейку по индексу в левой руке. Запомненное значение больше того, что по индексу в левой руке? Если да, то возвращаемся к запомненному значению и кладем в левую руку его порядковый индекс. Далее повторяем процесс с правой рукой: раскрываем руку, смотрим на значение по индексу в правой руке и если там лежит меньшее значение чем мы запомнили, то кладем индекс запомненного значения в правую руку. И так повторяем с каждой ячейкой.

    Может быть ты не до конца понимаешь синтаксис языка? Если после заголовка цикла (т.е. после
    for( size_t index = 1; index < stream_length; ++index )
    ) стоят фигурные скобки, то в них записано тело цикла - набор операций для каждой итерации цикла. В теле нашего цикла мы на каждой его итерации можем работать с уникальным индексом элемента массива.
  • Как сделать грамотную декомпозицию ООП?

    @MarkusD Куратор тега C++
    dsherbakov , ну да. И в примере всего два типа, и то оба избыточных и на корню ломающих принципы ООП. :)
    У тебя препод - весельчак чтоли? Любит шутки и мозголомные задачи?

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

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

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