• Как в с++ добавить переменную в обьект уже определённого класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Способ 1. Наследование.
    class Entity
    {
    public:
      virtual ~Entity() {}    // для корректной работы динамических структур данных 
                              // наподобие менеджеров уровней; в нашем примере не нужно;
                              // в реальной игре потребуется
    }
    
    class Player : public Entity
    {
    public:
       bool isDead;
    }
    
    int main()
    {
       Player player;
       player.isDead = true;
       return 0;
    }


    Если кто-то отдаёт Entity, окторый гарантированно Player — то
    Player& somePlayer = dynamic_cast<Player&>(someEntity);


    Способ 2. Композиция
    class Player
    {
    public:
       Entity entity;
       bool isDead;
    }


    Способ 3. Словарь. Это уже на случай, когда чужой код настолько монолитный, что ничем его не прошибёшь.
    struct PlayerInfo
    {
        bool isDead;
    }
    
    std::map<const Entity*, PlayerInfo> playerInfo;


    Если чужой код монолитный, а объекты ещё и перемещаются по памяти — тогда выяснить, что будет «значением» объекта (например, какой-нибудь идентификатор).

    typedef std::string PlayerId;
    std::map<PlayerId, PlayerInfo> playerInfo;


    Если и код монолитный, и «имя» или «значение» объекту никак не придумаешь — тогда никак.
    Ответ написан
    9 комментариев
  • Как присвоить переменную?

    @Mercury13
    Программист на «си с крестами» и не только
    Так, я был явно неправ, что язык — C++ Builder. Если это C++/CLI, то…
    String^ theLine = this->serialPort1->ReadLine();
    Вроде так.
    Ответ написан
  • Как сделать раздвоение цветов в php?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно, конечно, в одну "руку" взять красный канал, в другую остальные два, и сдвинуть их друг относительно друга. Но весь смысл анаглифа - показать предмет в объёме, чтобы на него можно было смотреть через анаглифные очки, а столь простой фильтр этого не сделает.
    Ответ написан
    Комментировать
  • Как назвать фракции в настольной игре (именование классов)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Я в конце концов назвал их…

    FactionRule
    FactionChoice
    Faction
    Player
    Мультиплеер пока бросил.
    Ответ написан
    Комментировать
  • Как сделать скриншот в Delphi, обработать(цвета), обрезать и вставить в картинку на форме без сохранения в файл?

    @Mercury13
    Программист на «си с крестами» и не только
    Скриншот делается так.

    procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp:TBitmap;
    begin
      bmp := TBitmap.Create;
      try
        bmp.PixelFormat := pf32bit;   // сейчас не нужно, но, вероятно, потребуется при обработке
        bmp.Width := Screen.Width;
        bmp.Height := Screen.Height;
        BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
               GetDC(0), 0,0,SRCCOPY);
        imgScreen.Picture.Assign(bmp);  // теста ради выведем на Image; в боевой проге не нужно
      finally
        bmp.Free;
      end;
    end;


    А уж получив скриншот в TBitmap, делай с ним что хочешь. Козявь цвета, обрабатывай как-нибудь… Как — это уже другой вопрос.
    Ответ написан
    Комментировать
  • Как сделать фантомное окно в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Включай свойство AlphaBlend. Даже если окошко хочешь непрозрачное, всё равно включай.
    2. Переопределяй две функции.
    procedure TfmMain.CreateParams(var Param : TCreateParams);  // override
    begin
      inherited;
      Param.ExStyle := Param.ExStyle or WS_EX_TRANSPARENT;
    end;
    
    procedure TfmMain.WmNcHitTest(var Msg : TWMNCHitTest); // message WM_NCHITTEST;
    begin
      Msg.Result := HTTRANSPARENT;
    end;
    Ответ написан
    Комментировать
  • Какой шрифт я получаю при использовании метода Font.getFont() в Java2ME?

    @Mercury13
    Программист на «си с крестами» и не только
    Как бывший ME’шник и видевший своими глазами кучу мобилок, скажу…
    Стандарта никакого нет. Nokia имела три шрифта со всеми начертаниями. Motorola — только один, без всяких начертаний. TTF, как правило, нет, шрифты обычно точечные. TTF — если он там TTF — можно, конечно, извлечь из прошивки телефона, но не программно на ME.
    N71, E51… Вспоминаю телефоны, было дело…
    Если нужен был широкий порт и единообразный вид на разных мобильниках, обычно писали собственный типографский движок.
    Ответ написан
    1 комментарий
  • Как не дать скорости падать?

    @Mercury13
    Программист на «си с крестами» и не только
    Что можно сказать?

    В хорошо закодированном видео меньше 1 бита на пиксель. На YouTube где-то 0,1…0,2 бита/пиксель, в хорошо закодированных видео с Рутрекера 0,3…0,4. Если взять 640×480 и эталонные 0,2 бита/пиксель — получается 1,5 мегабита, если 720p — уже 4 мегабита. Так что, если вы не смотрите 1080p, должен остаться приличный кусок. И роутер, пускай даже самый дешёвый, должен справляться, не 2007 на дворе. Пока вижу одно из двух.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Найди утилиту для тестирования клавиатуры и проверь: эти клавиши вообще на твоей клавиатуре вместе работают?
    Вот, например, несложная утилита онлайн: www.microsoft.com/appliedsciences/KeyboardGhosting...
    А вот в виде Windows-проги: www.pages-informatique.com/kbtesterv0.4.php

    Клавиши опрашиваются по матричной схеме без диодов; те клавиши, чьё нажатие неоднозначно, пропускаются.
    См. https://ru.wikipedia.org/wiki/Технологии_клавиатур
    Ответ написан
    2 комментария
  • Должно ли так быть?

    @Mercury13
    Программист на «си с крестами» и не только
    Ошибка у тебя в scanf.

    scanf("%lf",&x);

    %lg тоже работает — по крайней мере, на MinGW.

    Мало известно, но у scanf немного не такой формат подстановок, чем у printf.
    Ответ написан
    2 комментария
  • Сети Петри, разрешён ли такой переход?

    @Mercury13
    Программист на «си с крестами» и не только
    Переходы t1 и t2 создают в позиции по одной фишке. Переход t3 просто убирает одну фишку. Возможен. И после двух исполнений перехода t3 ни одной фишки не останется.
    Ответ написан
    1 комментарий
  • Как нужно изменить алгоритм Дейкстры чтобы он искал самый длинный путь?

    @Mercury13
    Программист на «си с крестами» и не только
    Варианты.
    1. Если граф циклический, максимальный путь — ∞.
    2. Если циклический, но путь обязан быть несамопересекающимся — Дейкстра не подойдёт. Подобную олимпиадную задачу я решал и там решением был перебор с кэшированием (вершин вроде до 15).
    3. Если граф циклический, но есть отрицательные веса, которые в определённых случаях дают-таки точный максимум — меняем знак, применяем модификацию Дейкстры для отрицательных весов. Он либо скажет, что есть цикл, позволяющий сколь угодно уменьшить сумму, либо даст точный минимум.
    4. Если ациклический ненаправленный — то либо один, либо нет вообще (т.н. лес);
    5. Если ациклический направленный — должен работать совсем другой алгоритм: отсортировать в топологическом порядке, убрать те элементы, которые перед началом и за концом, а на оставшихся пустить динамическое программирование.
    Ответ написан
    Комментировать
  • Как сделать простую многозадачность на Си?

    @Mercury13
    Программист на «си с крестами» и не только
    Это называется «кооперативная многозадачность» и такая была в Windows до 3. Если задача у нас отнимает больше, чем один квант времени, есть два варианта.
    1. Собрать кванты времени в конечный автомат. Каждый из элементов этого автомата должен сам сохранять свои регистры. Поскольку задача может быть сложная, удобно делать элементы автомата элементами структурного программирования — элемент «оператор», элемент «если», элемент «дождаться»… Мне это приходилось делать на Jav’е, с похожей целью — нужна была простейшая реализация сопрограмм с возможностью сохранения-загрузки, где мы остановились. Сложнее прикладное программирование, системное вообще не нужно.
    2. Использовать функцию Yield, которая сохраняет куда-то регистры процессора, переключает стековый сегмент, определяет, кому сейчас работать, и восстанавливает регистры нового процесса. Каждый процесс поминутно запускает этот Yield. Тут наоборот — процесс наполняется Yield’ами, и всё, а архитектуру машины надо всё же знать.

    Для подобного дела есть FreeRTOS, но как она работает — я не в курсе.
    Ответ написан
    2 комментария
  • Почему многие популярные интернет издания используют шрифт с засечками для основного текста, хотя это дурной тон?

    @Mercury13
    Программист на «си с крестами» и не только
    На печати длинный текст с засечками читается лучше. Линия засечек — это дополнительная направляющая, которая ведёт взгляд по строке. На компьютере, правда, случилось неожиданное: даже один пиксель с одной стороны и один с другой — это много. К тому же у многих букв с засечками (например, б, Ж, Л) есть кокетливые кривые, которые также не передашь пикселями.

    Когда субпиксельный рендеринг и высокие DPI уменьшили удельный вес засечек и выправили кривые, а Королькова и не только предоставили шрифты с засечками, оптимизированные под экран, стали потихоньку использовать.

    Как для меня, anekdot.ru на ретиноподобном планшете читается замечательно. И на читалке с 200 dpi лучший шрифт — PT Serif. А на настольнике с насильно отключённым ClearType (ну не перевариваю, как минимум в интерфейсах) — слабовато.

    P.S. Специально для вас включил ClearType — на этих двух новостных сайтах вышло довольно хорошо.
    Ответ написан
    Комментировать
  • Почему не возможен синхронизованный вывод двух потоков при использовании двух мутексов?

    @Mercury13
    Программист на «си с крестами» и не только
    А точно нельзя?
    Я бы сделал так…

    Поток 1.
    мютекс2.войди
    поток2.старт
    повторяй 10 раз
      мютекс1.войди
      writeln
      мютекс2.выйди
    поток2.дождись
    мютекс2.выйди

    Поток 2.
    повторяй 10 раз
      мютекс2.войди
      writeln
      мютекс1.выйди

    Обратите внимание, мы входим в один мютекс и выходим из другого. Проверю, отпишусь.

    Единственное спорное «средство синхронизации» — в потоке 1 дождаться завершения потока 2.
    Ответ написан
    3 комментария
  • Qt: как получить координаты немаксимизированного окна?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    normalGeometry()
    Ответ написан
    Комментировать
  • Что хранится в указателе на виртуальный метод класса в C++ Builder (содержимое __thunk__ )?

    @Mercury13
    Программист на «си с крестами» и не только
    Это сколько нужно байтов стека. В случае void* ничего возвращать не нужно. В случае int, char*, возвращаемое значение лежит в eax. В случае double — на верхушке стека сопроцессора. А в случае пользовательского класса — где-то в стеке вызовов. Класс Baz пустой, только указатель на ТВМ — потому 4 байта. Для класса Bar посмотри ради интереса sizeof — почти уверен, что те же 4 байта.
    Возможно, когда добавим локальных переменных, эта цифра тоже увеличится.
    Ответ написан
  • Как реализовать игру с графикой "Псевдо-3D"?

    @Mercury13
    Программист на «си с крестами» и не только
    Здесь и в Doom совершенно разные технологии.

    Здесь честное 3D, но со спрайтами. Гугли «billboard opengl» (или подставь ту 3D-библиотеку, которой пользуешься).

    В эпоху Doom трёхмерные чипы были недоступны, всё программно, силами процессора. Потому трёхмерщина была несколько ограниченная: полы всегда горизонтальны, стены вертикальны, использовалась двухточечная проекция, стены рисовались по столбцам, а полы — по строкам. Чтобы взглянуть вверх-вниз, эта проекция прокручивалась вверх-вниз. Сейчас так писать стоит только для машин, где нет трёхмерных чипов (какие-нибудь калькуляторы и читалки).
    Ответ написан
    Комментировать
  • Алгоритм генератора заявок для моделирования СМО с пуассоновским потоком?

    @Mercury13
    Программист на «си с крестами» и не только
    class Event {  //  интерфейс
    public:
      virtual double time() = 0;   // когда потребуется внимание со стороны менеджера событий
      virtual void process() = 0;  // команда обработать событие
      // virtual int type() = 0;      // можно пристроить, если по какой-то причине надо отличать кресло от генератора клиентов
    };
    
    class EventSink {  // интерфейс
      virtual void add(Event& x);
    }
    
    class Shop;
    
    class Chair : protected Event {
    private:
      double fTime;
      bool fIsOccupied;
    public:
      Shop& shop;
      virtual double time() override { return fTime; }
      virtual void process() override;
      {
         что-то типа…
         если shop.nWaiting != 0 {
            --shop.nWaiting;
            occupy(time);
         } else {
             isOccupied = false;
         }
      }
      void occupy (double aTime) {
            time = aTime + время обслуживания клиента
            shop.manager.add(*this);
       }
       bool isOccupied() { return fIsOccupied; }
    };
    
    class CustomerGenerator : protected Event {
       // Устроен аналогично Chair, служит для генерации потока клиентов
    public:
      virtual void process() override {
         если shop.nWaiting == 0 и кресло свободно {
            shop.chair.occupy(fTime);
         } else {
            ++shop.nWaiting;
         }
         fTime += экспоненциальное время ожидания;
         manager.add(*this);
      }
      void init() {
         fTime = 0;
         process();
      }
    };
    
    class Shop {
    public:
       Chair chair;  // можно несколько кресел
       CustomerGenerator generator;
       int nWaiting;  // сколько человек в очереди
       EventSink& manager;
    }
    
    class Manager : public EventSink {
       Event* events[2];   // события отсортированы по времени
       int nEvents;
    
       void add(Event& x) override {
          // вставить двоичным поиском x в нашу очередь;  тут же можно сделать ограничение
          // «обработать 1000 клиентов» или «работать 8 часов».
       }
    
       И самое главное — «жизненный цикл».
       shop.generator.init();
       Пока очередь не пуста…
       • вытащить из неё событие
       • process его!
    }


    Как оно работает?
    1. на 5-й минуте приходит посетитель. Значит, генератор вносится в очередь со временем 5 минут.
    2. Выбираем генератор из очереди. Поскольку в парикмахерской очереди нет, он садится в кресло (в список вносится кресло со временем 5+8 = 13 минут), в список вносится генератор со временем 5 + 3 = 8 минут.
    3. Из этой пары выбираем генератор (у него 8 минут, против 13 минут у кресла). Он вносит нашего товарища в очередь (теперь в очереди один), в очередь вносится генератор со временем 8+4 = 12 минут.
    4. Снова в очереди кресло и генератор, и минимальное время у генератора. Теперь в парикмахерской ждут двое, и генератор вносим в очередь на время 12 + 30 = 42 минуты.
    5. Теперь минимальное время у кресла, и оно обслуживает ещё одного посетителя, внося себя в очередь на (13 + 8 = 21 минуте.
    6. И снова минимальное время у кресла, оно вносит себя в очередь на 21 + 8 = 29 минут.
    7. Пришла 29 минута, но стричь-то некого! В очереди менеджера остался один генератор.
    8. Выбираем из очереди генератор, и так далее…

    (простите, что я написал сумбурно, ведь есть очередь событий в менеджере и очередь клиентов в парикмахерской).

    Не забудьте, что события добавляют не в хвост очереди, а куда угодно — ведь событие может, в свою очередь, каскадом вызвать другие события.
    Ответ написан
  • Законно ли использовать картинки на своём сайте с чужим URL (vk.com)?

    @Mercury13
    Программист на «си с крестами» и не только
    > Законно ли вообще встраивать картинки с чужими URL на своём сайте?
    Авторское право об этом ничего не говорит, это лишь технические подробности пользования картинкой.

    > Можно ли использовать их в своём блоге?
    Обычно нет. Но такие вот флажки зачастую берутся из известных коллекций. Такой же флажок, пиксель в пиксель, висит у меня в трее (Punto Switcher) — так что это меня заинтересовало, и я нашёл источник: www.famfamfam.com/lab/icons/flags/. Можно, они, по сути, PD (любое использование без всяких условий).

    > Например, если сделать список по странам на главной из 50 стран, то получается 50 запросов при каждом посещении?
    Да.
    Ответ написан
    6 комментариев