• Распиновка 3 пин вентилятора. Что значит s?

    @Mercury13
    Программист на «си с крестами» и не только
    Sense, контроль частоты. Всё как я думал: синий — земля. А красный с оранжевым — питание и контроль.
    Ответ написан
    9 комментариев
  • Как понять такое поведение LibGDX?

    @Mercury13
    Программист на «си с крестами» и не только
    Учите понятие «цикл обработки сообщений». Между drawing() и loadLevel() вызвать принудительную обработку оконных сообщений.

    Насколько я понял (фреймворка не знаю), надо Display.processMessages();
    Ответ написан
    Комментировать
  • Почему в логотипах редко используют красивые, сложные иллюстрации?

    @Mercury13
    Программист на «си с крестами» и не только
    Когда рыцари стали носить закрытые шлемы, изобрели гербы — на щите стали рисовать что-то, связанное с личностью рыцаря. И все страшные и сложные геральдические законы — это: 1) опознать рыцаря даже с сотни метров в сумерках; 2) при крайней дороговизне цветного рисунка сохранять изображения гербов в гербовниках.

    А ведь для логотипов то же самое. Опознать бренд, например, из кабины автомобиля или при беглом проходе мимо. И не везде доступны цветные изображения — дизайнер решил выворотку, ч/б принтеры намного дешевле, ксерокс всё ещё не отжил, оформленный одной (но хорошей) краской прибор выглядит дороже. Только прогресс идёт, принтеру или офсетной машине что текст, что рисунок — всё едино, и геральдический язык уже не нужен. И даже чертёж для Знака качества — отжившее дело, восстанавливать знак с линейкой и циркулем не надо, достаточно выложить SVG.

    Сложные иллюстрации некогда были мейнстримом, да и сейчас, например, в логотипе Киевского университета стоит его Красный корпус. Но тут всё зависит от того, на что мы ставим логотип: в университете — максимум на папку, да и Красный корпус сам по себе бренд. По той же причине выжил логотип кока-колы: на этикетке он более чем хорош. А сложное изображение богини Kwanon превратилось в предельно стилизованное Canon.
    Ответ написан
    1 комментарий
  • Как правильно определить питание cpu куллер?

    @Mercury13
    Программист на «си с крестами» и не только
    Силу тока не надо, ноутбучный кулер — не настолько мощная штука, чтобы превысило ток на какой-то линии.
    Цвета надо. Их, как правило, три или четыре: питание (красный/зелёный), земля (чёрный), контроль (белый/жёлтый) и ШИМ (на ноутбучных обычно нет, синий).

    Если кулер влезает, но провода не сходятся по разводке (то ли единичный брак, то ли на сходную модель) — для единичного ремонта ничего не стоит перепаять. Только не забудьте заизолировать термоусадкой.

    Касательно вашего кулера — вероятно, землю (а без неё никак) сделали синей. Единственный способ проверить это точнее — если кулер работает, подключить его к какому-то блоку питания на 5 вольт. Если не работает и вы разбираетесь в схемотехнике — распатронить и выяснить по управляющий плате, что и куда.
    Ответ написан
    1 комментарий
  • Почему единицы измерения разрешений экранов мониторов и смартфонов разные?

    @Mercury13
    Программист на «си с крестами» и не только
    > но этот экран в 10 раз меньше экрана моего ноутбука
    Если только по площади — если пропорции сходные, 15" больше 5,5" в 7,43 раза.

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

    Иногда размеры меряют в «диалоговых единицах» и «аппаратно-независимых пикселях» (например, 1px в вебе именно что «аппаратно-независимый пиксель», который может быть 2 или 3 реальных пикселя). Но это уже офтоп.
    Ответ написан
    1 комментарий
  • Алгоритм обхода площади за минимальное время?

    @Mercury13
    Программист на «си с крестами» и не только
    Если поворот «бесплатен», эквивалентны все несамопересекающиеся маршруты.
    Если нет — точного доказательства не вижу, но, по-видимому, тоже оптимальна (2h−2 поворота).

    UPD1. Если из-за каких-то особенностей прохождения поворотов на скорости нежелательны развороты на 180° — тогда спираль с первым отрезком по длинной стороне.
    Ответ написан
  • Qt. Как использовать сигналы-слоты?

    @Mercury13
    Программист на «си с крестами» и не только
    Нет, мы заводим где-то новый слот и подаём сигнал в него.
    Есть два способа завести новый слот: либо унаследоваться от QObject или его наследника (удобно унаследовать главную форму), либо воспользоваться лямбда-функцией C++11. Поскольку все наши формы на стеке, проще всего написать лямбду.

    connect(&Button, &QPushButton::clicked, 
                &Base, [&]() {
            // тут код
        });


    В реальных проектах каждая форма является наследником от QWidget (или чего-то подобного) и хранит свои компоненты. А слоты — это функции в форме.
    Ответ написан
    7 комментариев
  • Testing software for hardware. Что нужно знать о тестировании софта для периферии?

    @Mercury13
    Программист на «си с крестами» и не только
    Блин, я что, нажал на «Предпросмотр», затем F5? Повторю.

    1. Самому пользоваться этим железом, строить свои сценарии пользования.

    2. Ходить по форумам, выяснять чужие сценарии пользования и для чего покупают такое «железо».
    а) Мой сценарий пользования геймерской мышью: под большим пальцем кнопки браузера. Наклон колеса — очень быстрая прокрутка. Плюс быстрое переключение между работой и игрой (DPI/раскладка). У кого большой монитор и/или мало места — плавная (с шагом не более 100) регулировка DPI и сохранение, какой DPI был. В шутере, как известно, нужен большой DPI, но бывает, что тогда в меню курсор просто гоняет — значит, нужна легкодоступная регулировка в обе стороны.
    б) Не совсем, конечно, ПО, но всё-таки. Если у мыши настраиваемая высота подъёма, что будет, если она заглючит или пользователь выставит минимальную высоту? Не останемся ли мы с недействующей мышью без возможности запустить её снова?
    в) Выяснилось, что симмерам на RGB-клавиатурах нужна подсветка зонами. И от меня: подсветка в зависимости от раскладки клавиатуры.

    3. Подобное ПО, как правило, глючное, жирное (как для резидентной программы) и плохо локализованное. Выяснять, что в нём не так. Вот мои типичные жалобы.
    а) У дешёвых RGB-светодиодов плохая цветопередача. Можно ли её компенсировать программно? (Ну и ШИМ заел, но это уже аппаратное.)
    б) Часто приходится перекладывать руку с клавиатуры на мышь. Бывает, что ввод с клавиатуры, а OK — мышью.
    в) Можно ли разделить программу на резидентную управляющую и нерезидентную утилиту конфигурирования?
    (Мне-то с ПО Gigabyte повезло, за исключением юзабельности — там резидентного вообще ничего нет, вся логика, даже перекалибровка датчика, в самóй мыши.)
    Ответ написан
    Комментировать
  • C++ Builder и ProgressBar. Как сделать постоянное отображение квадратика бегающего слева направо?

    @Mercury13
    Программист на «си с крестами» и не только
    Нужно дать возможность оконным сообщениям ходить и обрабатываться.

    Простой способ. Поминутное Application->ProcessMessages().
    Сложный способ. Вынести долгую операцию в поток.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Что вы имеете в виду? Инициализировать и закрыть библиотеку по мере появления-исчезновения объектов? Вот мой код (работает с cURL, но понятно).

    В чём его смысл? Как только объект cURL требуется первый раз, инициализируем глобальный объект. Теперь, скорее всего, cURL будет разрушен с его деструктором. Но если в каком-то потоке объект cURL будет слишком долго жить — ничего, подождём.

    (Внимание, тут гонка, если одновременно потребуются два объекта cURL. Нам такое не нужно, но если вдруг — защитите по принципу Singleton’а.)

    namespace curl {
    
        std::atomic<size_t> nLib(0);
    
        class _Lib
        {
        public:
            bool isIn = false;
            ~_Lib();
        };
    
        _Lib lib;
    
        void addLib()
        {
            int q = ++nLib;
            if (q == 1) {
                lib.isIn = true;
                q = ++nLib;
                curl_global_init(CURL_GLOBAL_ALL);
            }
            //std::cout << "Added lib, now " << q << std::endl;
        }
    
        void releaseLib()
        {
            int q = --nLib;
            if (q == 0) {
                //std::cout << "Cleaned up lib" << std::endl;
                curl_global_cleanup();
            } else {
                //std::cout << "Released lib, now " << q << std::endl;
            }
        }
    
        _Lib::~_Lib()
        {
            if (isIn)
                releaseLib();
        }
    
    }
    
    curl::Curl::Curl()
    {
        addLib();
        fData.handle = curl_easy_init();
    }
    
    curl::Curl::~Curl()
    {
        if (fData.handle)
            curl_easy_cleanup(fData.handle);
        releaseLib();
    }
    Ответ написан
    Комментировать
  • Как перевести число в строку с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Ошибка вот где.
    else {
                cout<<"False";
                return 0;
            }
        }

    Проверяет только первую цифру, и если она не 3 — сразу же говорит false.
    Ответ написан
  • Можно ли написать такой драйвер под windows?

    @Mercury13
    Программист на «си с крестами» и не только
    vjoystick.sourceforge.net/site
    www.headsoft.com.au/index.php?category=vjoy
    Авось что-нибудь придумаете с этими драйверами. У обоих есть SDK.

    Есть ещё PPJoy, но сайт его какой-то мутный.

    Ну и, как сказал 123459, бывает проще сделать HID-устройство прямо внутри Arduino.
    Ответ написан
    Комментировать
  • Deadlock found when trying to get lock; try restarting transaction?

    @Mercury13
    Программист на «си с крестами» и не только
    Транзакции борются за строки таблицы таким образом, что их можно рассудить, лишь откатив одну из них. Не опасно. На уровне настроек сервера не решается, дело в прикладном коде.
    1. При взаимной блокировке откатить транзакцию и повторить снова.
    2. На ключевых транзакциях установить более мягкое или жёсткое правило изоляции транзакций.
    3. Кому-то помогало переписывание индексов: Mysql: Deadlock found when trying to get lock; try restarting transaction
    4. sqlinfo.ru/forum/viewtopic.php?id=2291 Кто-то сделал неверный LOCK и вместо деда Мороза пришёл дед Лок.
    5. Переписать архитектуру программы так, что не потребуется миллионы раз обращаться к одному и тому же.
    Ответ написан
    Комментировать
  • Как сделать преобразование hex to float правильно?

    @Mercury13
    Программист на «си с крестами» и не только
    Мы присвоили float’у целое число. Надо использовать union.
    union {
            float asF;
            uint32_t asI;
        };
        asF = 0x3EAE147B; // в десятичной - 0.340
        std::cout << asF << ' ' << std::hex << asI << std::endl;
        asI = 0x3EAE147B;
        std::cout << asF << ' ' << std::hex << asI << std::endl;
        return 0;
    Ответ написан
    Комментировать
  • Часто ли .net программисты сталкиваются в работе с с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Существует версия C++ для .NET — называется C++/CLI. Но в целом нет нужды в управляемой мусорной среде писать на C++, языке, рассчитанном на старый добрый машинный код и который таскает в архитектуре кучу «хвостов» времён ассемблеров.
    Так что мой ответ — в 99% случаев нет.
    Ответ написан
    Комментировать
  • Как исправить функцию с переменным числом аргументов?

    @Mercury13
    Программист на «си с крестами» и не только
    char *format = (char*)malloc((sizeof(PACKAGE_NAME) + sizeof(PACKAGE_VERSION) + sizeof(msg)) * sizeof(arguments));

    У вас выделяется (и к тому же не освобождается) буфер совершенно рандомного размера. У меня работает и так, но это вопрос везения. Даже если написатьchar format[200]; будет лучше.

    1. Более точно (запас допустим, нехватка  — нет) высчитать длину буфера.
    2. Освободить его, наконец!
    static const char* FORMAT1 = "[%s-%s]: %s\n";
      char *format = (char*)malloc(strlen(FORMAT1) + strlen(msg) + strlen(PACKAGE_NAME) + strlen(PACKAGE_VERSION) + 1);
      sprintf(format, "[%s-%s]: %s\n", PACKAGE_NAME, PACKAGE_VERSION, msg);
      va_start(arguments, msg);
      vprintf(format, arguments);
      va_end(arguments);
      free(format);


    Более удачное, но менее универсальное решение — printf заголовок, vprintf строку.
    printf("[%s-%s]: ", PACKAGE_NAME, PACKAGE_VERSION);
    
      va_list arguments;
      va_start(arguments, msg);
      vprintf(msg, arguments);
      va_end(arguments);
    
      putchar('\n');


    UPD1.
    Ваша новая ошибка — в коде
    char *msgbuf = (char*)malloc(strlen(msg) * sizeof(arguments));

    Раз уж хотите так, решение — вычислить длину буфера через snprintf.
    Ответ написан
  • Как побороть warnings?

    @Mercury13
    Программист на «си с крестами» и не только
    19/20. Полю int* argkeys::shortName вы присваиваете строковый литерал, то есть const char*.
    26/27. 4-му полю int option::val вы присваиваете argkeys::shortName то есть int*.
    25. Переменная не задействована.
    30. Функция ничего не возвращает.

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

    Что могу предположить? В структуре int* shortName заменил бы на int id или char id, и присвоил бы ему символьный литерал (то есть 'h'). Это автоматически решит и второе предупреждение (как только заменим там shortName на id).
    А 25 и 30 — сначала допишите программу до конца.
    Ответ написан
    Комментировать
  • Правильная красная строка или её зарубежный аналог?

    @Mercury13
    Программист на «си с крестами» и не только
    По-английски нашёл: paragraph leading, paragraph spacing.
    По-русски вроде бы «интервал между абзацами».
    Ответ написан
  • Можно ли сделать массив меток goto?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы не представляете себе, так обычно и работает switch.
    prog21.dadgum.com/166.html
    Ответ написан
    5 комментариев
  • Как на C++ узнать количество передаваемых аргументов?

    @Mercury13
    Программист на «си с крестами» и не только
    Какие есть способы физически, на уровне машинного кода, передать переменное число параметров в подпрограмму?

    1. Автобоксинг в массив. Если к тому же тип элементов может быть любым — тогда будет массив «лёгких» или обычных variant’ов, или массив объектов на «куче». В Delphi для этого используется лёгкий variant (см. SysUtils.Format), в Java и других «мусорных» языках — объекты на куче. В Си++ нет.

    2. Автоматически развернуть такой вызов в кучу вызовов поменьше. См. вариативные шаблоны C++11 = variadic templates. В Си++ есть, штука тяжёлая, я с ней и сам знаком поверхностно и ничего толком рассказать не могу. Но вот кое-что набросал.
    #include <iostream>
    
    constexpr int countArgs() { return 0; }
    
    template <class Arg, class ... Args>
    constexpr int countArgs(const Arg& x, const Args& ... args)
    {
        return countArgs(args...) + 1;
    }
    
    int main()
    {
        std::cout << countArgs() << std::endl;
        std::cout << countArgs(1, 2, 3) << std::endl;
        return 0;
    }

    Может быть, и первый путь удастся завернуть в массив через вариативные шаблоны, но я не в курсе. А вот обрабатывать аргументы по одному — за милую душу!

    3. Использовать особые соглашения вызова и раскручивать стек, пока не попадётся какой-то маркер «больше параметров нет» (см. работу с формами cURL), или окольным путём узнать количество параметров (см. printf). Есть даже в Си (который не что иное, как «ассемблер высокого уровня»), штука очень системная и чреватая ошибками.

    4. Возможна ещё и такая фишка: физически оно устроено как printf, но обёрнуто в «лёгкий» вариативный шаблон, который защищает всё это добро от ошибок программиста.
    #include <iostream>
    #include <cstdarg>
    
    constexpr int countArgs() { return 0; }
    
    template <class ... Args>
    constexpr int countArgs(int x, Args ... args)
    {
        return countArgs(args...) + 1;
    }
    
    void outArgsInner(int count, ...)
    {
        va_list ap;
        va_start(ap, count);
        if (count > 0) {
            std::cout << va_arg(ap, int);
            for (int i = 2; i <= count; ++i) {
                std::cout << ' ' << va_arg(ap, int);
            }
        }
        va_end(ap);
        std::cout << std::endl;
    }
    
    
    template <class ... Args>
    inline void outArgs(Args ... args)
    {
        outArgsInner(countArgs(args...), args...);
    }
    
    int main()
    {
        outArgs();      // пустой тоже работает
        outArgs(1, 2, 3);
        // outArgs("a", 2, 3);   тут ошибка! — и верно, мы принимаем только int’ы
        return 0;
    }
    Ответ написан
    Комментировать