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

    @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 комментариев
  • Как правильно передать в функцию ссылку на двумерный массив?

    @Mercury13
    Программист на «си с крестами» и не только
    void readResponses(string address, string (&rResponse)[15][4]) {}


    Двухмерный массив — НЕ указатели на указатель, это тебе не Ява. Это массив одномерных массивов.

    Нормального способа передачи массивов фиксированной длины в Си нет (только через ук-ль на первый элемент), в Си++ — через ссылку.
    Ответ написан
    6 комментариев
  • Как правильно обратно вернуть значения в байты с помощью побитовых операций?

    @Mercury13
    Программист на «си с крестами» и не только
    byte[] streamedResponse = new byte[100];
    for (int iWord = 0, iByte = 4;
            iWord < 50;
            ++iWord, iByte += 2) {
        int w = MassCurrentsPhases[iWord];
        streamedResponse[iByte] = (byte)w;
        streamedResponse[iByte + 1] = (byte)(w >> 8);
    }

    Что представляет собой четырёхбайтовый заголовок, который вы пропустили, я не знаю.
    Ответ написан
  • Float обратно в байты как реализовать?

    @Mercury13
    Программист на «си с крестами» и не только
    int asInt = Float.floatToIntBits(asFloat);
    byte data0 = (byte)asInt;
    byte data1 = (byte)(asInt >> 8);
    byte data2 = (byte)(asInt >> 16);
    byte data3 = (byte)(asInt >> 24);


    Как я понял, вы тут сериализацией занимаетесь, для этого в Java обычно используют порядок байтов Motorola и все Stream’ы выдают именно его. А тут у вас порядок Intel — видимо, для совместимости с кем-то.
    Ответ написан
  • Как назвать переменную?

    @Mercury13
    Программист на «си с крестами» и не только
    pluralDays
    Ответ написан
    Комментировать
  • Как правильно обновлять элемент EDITTEXT?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Для переноса строк использовать символ 13 (\r).

    2. ES_AUTOVSCROLL Automatically scrolls text up one page when the user presses the ENTER key on the last line.
    Так что не это тебе нужно, нужно просто ставить курсор в конец (исходники Delphi дают сообщение EM_SETSEL).

    3. Я не знаю, как ты управляешь памятью, но будь с этим предельно осторожен.

    4. strcat будет медленным, когда данных будет много, подумай про имитацию ввода (сообщение EM_REPLACESEL).
    Ответ написан
    1 комментарий
  • Как правильно указать промежуток чисел,при котором будет правильно выбран падеж слова?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот правила множественного числа разных языков.
    www.unicode.org/cldr/charts/latest/supplemental/la...

    Я с подобным работал, и если есть возможность выдавать один и тот же ответ в двух разных ветках — то так.
    Остаток от деления на 100 от 5 до 20 → «ворон»
    Остаток от деления на 10 равен 1 → «ворона»
    Остаток от деления на 10 от 2 до 4 → «вороны»
    Иначе — «ворон».

    Я эти правила записывал вот в таком виде.
    <pluralRules nDecisions="3" unknownInt="2">    ← вариантов три; если ни одно из правил не подошло, брать последний («ворон»)
    		<rule mod="100" min="10" max="20" decide="2" />  ← остаток на 100 от 10 до 20 — «ворон»
    		<rule mod="10" min="1" max="1" decide="0" />
    		<rule mod="10" min="2" max="4" decide="1" />
    	</pluralRules>
    Ответ написан
    Комментировать
  • Разрешено ли использование стиля OS X в открытом проекте?

    @Mercury13
    Программист на «си с крестами» и не только
    Иконки-то откуда? Под OS X косят все, кому не лень, а тут ещё и закос не полный, не до смешения.
    Если иконки не украдены, всё в порядке.
    Ну и маленькая подсказка — улучши слегка жизнь тем, кто на Windows, сейчас там точечный шрифт, которым много не не напишешь.
    Ответ написан
    Комментировать
  • Является ли статическая функция С++ потокобезопасной?

    @Mercury13
    Программист на «си с крестами» и не только
    1. На что вам две статических переменных set?
    2. Не забудь, переменная статическая и находится в сегменте данных. Так что конструктор Settings() будет выполнен перед запуском main.
    3. Функция возвращает ссылку без const. Будут ли меняться настройки? Да — опасно почти гарантированно (структуры данных, потокобезопасные по записи — дело редкое и сложное). Нет — возвращай const Settings& и убедись, что все поля Settings также потокобезопасны по чтению (обычно ответ на этот вопрос да).
    4. А initializeDefaults() потокобезопасен? Скорее всего, нет.

    > Является ли вызов данной функции потокобезопасным?
    Нет однозначного ответа, скорее всего, нет.

    > Выполняется ли проверка File()::exists(settingsFilePath) при каждом обращении к функции?
    Выполняется.

    ЗЫ. Функция вот такого типа точно потокобезопасна — в ней просто нет объектов, за которые можно устраивать гонку.
    static inline Settings applicationSettings(){
        if (!File::exists(settingsFilePath)){
            Settings set(settingsFilePath);
            set.initializeDefaults();
            return set;
        }else{        
            return Settings(settingsFilePath);
        }
    }
    Ответ написан
    Комментировать
  • Qt: как наладить большой DPI в QTableView?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Через QFontMetrics получил шрифт и установил его размер, вроде работает.
    Ответ написан
    Комментировать
  • Как в Qt сделать двухстрочную шапку таблицы?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Поскольку решение лежит в комментариях, вынесу его наружу.
    qt-apps.org/content/show.php/HierarchicalHeaderVie...
    В общем, задача решена.
    Ответ написан
  • Некачественные изображения на сайте в Internet Explorer, Edge. Как поправить?

    @Mercury13
    Программист на «си с крестами» и не только
    Так я и думал, картинка там едва ли не в экран и уменьшена.
    Думайте сами — вероятно, дать им изображение конкретного размера, пиксель в пиксель.
    Ответ написан
  • Какая разница между String& operator+ (); и String operator+ ();?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое возвращает по ссылке, второе по значению. Первое просто возвращает адрес, второе делает копию. Как определить, что нам нужно?
    Где у нас результат: в локальной переменной или нет?

    Перед нами операция «унарный плюс», которая, скорее всего, ничего не делает и return *this. Этот самый *this точно не локальный. Потому возвращаем по ссылке, String&.

    А теперь возьмём бинарное сложение. Мы создаём новую строку (как локальную переменную, разумеется), заносим в неё сумму… а чтобы она не исчезла раньше, чем её подберёт вызывавшая подпрограмма, вернём по значению (String).

    Для виртуальных функций обычно перестраховываются и возвращают по значению (String). Чхают на копирование, зато если вдруг потомку потребуется вернуть что-то локальное, он без проблем вернёт.
    class Father {
    private:
      String fName;
    public:
      virtual String& name() const { return fName; }  // пока всё нормально, но…
    };
    
    class Son : public Father {
    public:
      String& name() const
         { return Father::name() + "'s son"; }   // ошибка, возвращаем локальную переменную!
    };
    Ответ написан
    Комментировать
  • Как найти минимальное количество перестановок?

    @Mercury13
    Программист на «си с крестами» и не только
    Рассмотрим порядок чёт-нечет-чёт-нечет…
    Считаем, сколько чётных не на своих местах (=a).
    И сколько нечётных не на своих местах (=b).
    Если a≠b, у нас нет N чётных и N нечётных — выводим «неверный набор данных».
    А если равны, то для порядка чёт-нечет нужны a замен. Для противоположного — N-a.
    Вот и получается ответ min(a, N−a).
    Ответ написан
    7 комментариев
  • Как в узлы бинарного дерева вставить упорядоченный массив?

    @Mercury13
    Программист на «си с крестами» и не только
    Немного непонятно, для чего вам это нужно. Если это учебный код, то пишите по-студенчески. В промышленном коде я бы как можно больше пользовался проверенными функциями. Массив — std::vector, дерево сортировки — std::set/std::map.

    Сбалансированному упорядоченному бинарному дереву нужен ключ, по которому оно упорядочивает. Есть два варианта.

    1. Ключ — что-нибудь с естественным сравнением, например, int. Тогда std::map<int, std::vector<int> >.

    2. Ключ — тот самый массив. Тогда std::set<std::vector<int> >. (В предыдущей версии я явно писал механизм сравнения, оказывается, он уже есть и писать ничего не нужно!)
    Ответ написан
    Комментировать