Задать вопрос
  • Будет работать монитор?

    @Mercury13
    Программист на «си с крестами» и не только
    Максимальное разрешение определяется пропускной способностью DVI/HDMI/DP. Судя по Вике, это действительно максимальное разрешение монитора на DVI Dual Link 60 Гц.
    Поскольку вы подключили два монитора, параллельно действуют два чипа, и никаких проблем.
    Существуют видеоплаты/мониторы, которые дают нужную вам пропускную способность по ДВУМ кабелям, подключённым в параллель к одной видяхе и одному монитору, но это, видимо, не ваш вариант.
    Ответ написан
    Комментировать
  • Как подсчитать комбинацию шагов коня на матрице 4 на 3?

    @Mercury13
    Программист на «си с крестами» и не только
    Твоё дело — перебор с кэшированием.
    Для каждой кнопки вручную закидываем в массив конских «соседей» — ни одного для 5-ки, три для 4 и 6, два для остальных.
    Затем заведи массив 10×7 (стартовая кнопка×длина) и устрой рекурсию с одним небольшим добавлением: если оно закэшировано, брать из кэша. Правила — f(b, 1) = 1, для остальных — sum{c=сосед(b)} f(c, i−1).
    Можно и динамическим программированием, без рекурсии — всё равно расход вычислительной мощи незначительный. Сначала f(b, 2), затем f(b, 3), и т.д. до 7.
    Ответ написан
  • Соединение точка-точка через интернет?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое, что нужно проверить,— провести сессию в пределах одного компьютера с соединением по localhost или 127.0.0.1. Там никакая настройка роутера не помешает.

    Потом — в пределах одной локальной сети по внутрисетевому адресу. Это первый выход в настоящую сеть!

    Затем можно попробовать и через Интернет.

    Если соединялись из той же сети по внешнему IP-адресу роутера: такой маршрутизации (т.н. NAT hairpin) по умолчанию нет, но в некоторых роутерах бывает: пакет, пришедший из внутренней сети на внешний адрес, считается пришедшим извне.

    Если вы соединялись из другой сети (разумеется, по внешнему IP-адресу): проверьте настройку маршрутизатора. Убедитесь, что внешний адрес на маршрутизаторе — реальный интернетовский. Попробуйте наладить другой сервер (например, Апач или игровой). Как правило, после всех этих мытарств проблем не бывает.

    Если «извне» — это работа, то, вероятно, куча портов перекрыта. Тоже стоило бы проверить.
    Ответ написан
  • Освобождается ли память по завершению выполнения функции, если массив инициализировать внутри функции?

    @Mercury13
    Программист на «си с крестами» и не только
    char * a = "hello!";
    Для указателя a — разумеется, на стеке.
    Строка, на которую он смотрит, "hello",— строковый литерал. Для него память изначально, при пуске программы выделена в сегменте данных. Освобождать не надо. На многих платформах — хоть на это рассчитывать не надо — этот сегмент защищается от записи и при попытке туда записать AV.
    Ответ написан
    8 комментариев
  • Разработка под Windows - MSVC или TDM GCC (MinGW)?

    @Mercury13
    Программист на «си с крестами» и не только
    3) Использование инициализации списком для структур (POD) с уже прединициализированными полями:

    Это C++11. Хорошее дело. MinGW поддерживал, пока стандарт ещё вырабатывался. MSVC начал было, да бросил и довёл до конца аж в 2015!!

    1) Разное содержимое одних и тех же хедеров

    Не выбивается из стандарта.

    2) MSVC спокойно компилирует нечто вроде

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

    но при этом не компилирует код, если не-void функция не возвращает значение

    Хорошая диагностика, но это лишь warning, а не error. Компилятору трудно знать, возможен ли тот или иной путь исполнения кода.
    Ответ написан
    Комментировать
  • Не понимаю, что такое модульная сетка?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое определение говорит о вёрстке вообще. И даже второе слишком общее. Более-менее правильное такое.

    Есть некая базовая единица измерения — модуль. Это может быть шаг строки, размер картинки или что-нибудь ещё. И все размеры на сайте выставляют исходя из нескольких таких единиц. Пошло оно из архитектуры, где модули — толщина перекрытия, высота этажа, расстояние между окнами…

    Сами направляющие невидимы. Но мы видим границы блока текста, границы картинок, начало или конец одинокой строчки. И глаз радуется, когда эти элементы выстраиваются по горизонтальным и вертикальным линиям. И не просто выстраиваются, а вдруг оказывается, что размер А равен размеру Б.

    На ватмане эти направляющие рисовали, потом стирали. На компьютере — они находятся где-то на непечатаемом слое и блоки к ним прилипают.

    Всегда следовать модульной сетке? Нет, конечно. Дизайнов разных куча. Где он академичнее, там модули; где закос под что-то неформальное — стараются модули делать там, где пишущий краской на стене действительно сделал бы две вещи одинакового размера. А иногда выровнять одно с другим — это натянуто.

    Я бы дал такие правила.
    1. Не впихивай невпихуемое. Если не получается выровнять по художественным или техническим причинам — зачем это прокрустово ложе?
    2. Не мельчи модуль. Если не видно, что размеры кратны — пропадает смысл.
    3. Модуль не обязательно один. Высота картинки и высота строки могут быть некратны, например, если нет обтекания картинок текстом.
    Ответ написан
    3 комментария
  • Как логичнее расположить кулер чтобы было лучшее охлаждение?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два вида кулеров, осевые и центробежные.
    Осевые — подвод с торца и выброс с другого.
    Центробежные — подвод с торца и выброс на периферию.

    Первое понятно, центробежный кулер забирает через решётку и выбрасывает на радиатор. А второе что? Если толщина девайса — пара сантиметров, на осевой кулер не похоже. К тому же изрядная часть радиатора фактически не действует.
    Ответ написан
    5 комментариев
  • Как сравнить строки в c#, чтобы получить результат сравнения в процентах?

    @Mercury13
    Программист на «си с крестами» и не только
    Так данная строка будет описанием или нет? Считаем, что будет.

    1. Бьём строки на слова.
    2. Возможно, выкинуть незначащие слова и преобразовать все в базовую форму. Надо признаться, тяжёлое дело: если нет словаря, то «дочь генерала» — это сущ+глагол или сущ+сущ? А со словарём: «уж» — это частица или существительное? В общем, лучше выдавать все возможные основания, и у нас получается нетранзитивное «=» — OK, если совпадает хотя бы одна форма. Возможно, проводим ёфикацию или деёфикацию: первое сложнее, второе чревато ложными срабатываниями.
    3. Вычисляем расстояние Левенштейна между этими массивами, считая неделимыми сущностями не буквы, а слова.
    4. Преобразуем его в наш процент — например, % = d / max{|s1|, |s2|}.

    Можно продолжать: если совпадение не только по основанию, но и по форме — дополнительные очки. Работать с синонимами, как из словаря, так и ручными, например, небезызвестный Milfgard придумал игру «Шакал», и вручную, по результатам исследования логов, вписал синоним «Койот». А нужно ли работать с орфоошибками? В том числе с неправильным написанием слова наподобие «джин/джинн»? И тот, и другой встречается в бутылке, но первый пьют, второй исполняет желания. :)

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

    @Mercury13
    Программист на «си с крестами» и не только
    По Википедии…

    Резисторно-транзисторная
    Эмиттерно-связанная
    Диодно-транзисторная
    Транзисторно-транзисторная
    Интегрально-инжекционная
    На диодах и транзисторах Шоттки (традиционно и неверно тоже считается ТТЛ)
    n-МОП
    КМОП

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

    Смысл транзистора (в ключевом режиме) — переключением одной цепи мы переключаем другую. Это же можно сделать и на радиолампах, и на реле.

    Копаясь по Википедии, я выяснил, что нелинейные элементы, пригодные для логики, должны обладать такими свойствами.
    • Восстановление логических уровней — если на вход придёт плохой «0» или плохая «1» (но всё же он примет её за 0 или 1), на выходе будет «0» или «1» значительно лучшего качества.
    • Каскадируемость: можно наладить g(f(x)).
    • Fan-in: возможность использовать несколько сигналов одним элементом.
    • Fan-out: выдача сигнала на несколько элементов.
    • Изоляция между входами и выходами.

    Говорят, будущее — оптические компьютеры, но на входах и выходах таких компьютеров один хрен придётся свет преобразовывать в электричество.

    Если что-то сделать, не используя процессоры — к вашим услугам аналоговые вычислительные машины. Без транзисторов и тиристоров в них (электронных, естественно) тоже никуда, но процессора в них нет. А ведь есть и механические АВМ (гуглите, например, ПУАЗО, немало крови попортивший немецким бомбовозам), и гидравлические АВМ (гуглите гидроинтегратор, MONIAC).

    ЗЫ. На резисторах, конденсаторах и прочих пассивных не получится: нужен активный элемент, т.е. который умеет управлять потоками энергии, а не только рассеивать или накапливать. На диодах, думаю, можно, но тяжело.
    Ответ написан
    Комментировать
  • С++: Вызов различных конструкторов в зависимости от пользовательского ввода?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Свой код — сделать функцию init
    Foo foo;
    if (someFlag)
      foo.init("SomeString");
      else foo.init(42);

    2. Чужой код — сделать обёртку, которая в init будет использовать placement new, а в деструкторе — явно вызывать деструктор объекта.
    class FooWrap {
    public:
      FooWrap() : hasFoo(false) {}
      void init(int x) { new (fooPlace) Foo(x); hasFoo = true; }
      Foo& operator * () { return *reinterpret_cast<Foo*>(fooPlace); }
      Foo* operator -> () { return reinterpret_cast<Foo*>(fooPlace); }
      ~FooWrap() { if (hasFoo) (*this)->~Foo(); }
      // Да, и конструктор копирования и op= не забыть — оставлю как упражнение.
    private:
      char fooPlace[sizeof(Foo)];
      bool hasFoo;
    }
    
    FooWrap foo;
    if (someFlag)
      foo.init("SomeString");
      else foo.init(42);
    foo->doFoo();

    Для большей надёжности стоит указать, что FooWrap выравнивать как Foo — это делается через C++11 или расширениями компилятора.
    Ответ написан
    3 комментария
  • Как добавить динамическую библиотеку в проект напрямую?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача lib — указать если не код функций, то хотя бы каким образом их прилинковывать из DLL. В частности, как «искозявлено» имя функции при переводе с Си на Си++. Этот самый lib — издержка разделения функций между компилятором и линкером.
    Не знаю, как MSVS/cl, но MinGW/ld с определённого момента начал прилинковывать DLL просто по наличию этого DLL, без построения *.a (а Embarcadero/ilink32, насколько мне известно, умел это изначально). С одной стороны, это серьёзно упрощает жизнь. С другой — для некоторых хитрых способов преобразования имён (или даже без имён, как в небезызвестном storm.dll) он не выцепит, что с чем слинковывать, *.a всё равно потребуется.
    stackoverflow.com/questions/31708832/how-to-refere...
    www.codeproject.com/Questions/613668/Is-it-possibl...
    Простейший, действующий на любом компиляторе способ — это сделать DLL-заглушку со всеми нужными нам функциями в нужных нам соглашениях вызова и с нужным образом закозявленными именами. Код может быть любым, хоть пустым. Компилируем, подставляем этот lib и правильный DLL.
    Второй способ — получить список имён функций, собрать их в *.def с правильными соответствиями «имя в коде — имя в DLL» и сделать из этого *.lib. Какими программами это делается в MSVS — описано по одной из ссылок.
    Ответ написан
    2 комментария
  • Динамический массив строк, используя string, в чем проблема?

    @Mercury13
    Программист на «си с крестами» и не только
    i++;
        a[2] = "monday";

    Выход за пределы массива. Массив длины 2 имеет два элемента: [0] и [1].
    Ответ написан
    Комментировать
  • Как "устроены" Emoticons?

    @Mercury13
    Программист на «си с крестами» и не только
    Вопрос: этот JSON мы разбираем или нет?
    Для простоты предположим, что разбираем (ну или транслятор JS разбирает — всё едино). Тогда текст у нас закодирован в UTF-16.
    • Символы 0000…D7FF — они и есть.
    • Символы D800…DBFF — за этим символом должен идти символ из DC00…DFFF, и они образуют суррогатную пару, которая будет одним символом. Подробнее гугли «UTF-16». Если идёт один из этих двух символов без пары — это некорректный UTF-16.
    • И символы E000…FFFF также кодируются как есть.

    Вот эта суррогатная пара, которую ты подкинул, кодируется в символ 1F345, помидор какой-то.

    Функция конвертации суррогатной пары в код символа:
    charCode = 0x10000 + ((leadingCode & 0x3FF) << 10) + (trailingCode & 0x3FF)

    А уж какие коды вам не нужны — копайте таблицы Юникода.

    Более простой способ, который вам может подойти — запретить все суррогатные пары.
    Ответ написан
  • Delphi. Как Узнать номер диска по его букве?

    @Mercury13
    Программист на «си с крестами» и не только
    stackoverflow.com/questions/5501749/how-do-you-get...
    На Паскаль сам переведёшь? Внимание, работает только для фиксированных дисков.
    Ответ написан
    Комментировать
  • Когда имеет значение порядок подключения заголовочных файлов?

    @Mercury13
    Программист на «си с крестами» и не только
    Заголовочные файлы надо писать так, чтобы порядок их подключения был неважен.

    В реализации подключать первым собственный заголовочник — правильная идея; так мы убеждаемся, что в заголовочнике нет недостающих зависимостей.

    Совать #include в пространство имён без хорошего обоснования не стоит.

    По вашему обтекаемому описанию не видно, как устроены ваши заголовки, именованное пространство имён или нет, закрыты ли все скобки в хедерах, и т.д. Но причина ошибки очевидна: из-за пространств имён компилятор не отождествил классы в первом и втором заголовке; предварительное объявление «class A;» осталось неразрешённым. Поэкспериментировав, я выяснил вот что.
    // Не компилируется!
    class A;
    
    namespace XXX {
        std::shared_ptr<A> a;
        class A { public: int x; };
        void xxx();
    }
    
    void XXX::xxx() {
        a->x;
    }


    // Компилируется!
    class A;
    
    namespace XXX {
        class A { public: int x; };
        std::shared_ptr<A> a;
        void xxx();
    }
    
    void XXX::xxx() {
        a->x;
    }

    // Тоже компилируется!
    namespace XXX {
        class A;
    }
    
    namespace XXX {
        std::shared_ptr<A> a;
        class A { public: int x; };
        void xxx();
    }
    
    void XXX::xxx() {
        a->x;
    }

    В первом случае shared_ptr<::A>, который, естественно, не определён (есть XXX::A).
    Во втором — определение наперёд ::A вообще ни на что не сдалось; используется shared_ptr<XXX::A>.
    В третьем примере только один тип, XXX::A.

    Если первым идёт не использование, а make_shared — выходит другая ошибка, не удаётся получить sizeof недоопределённого типа A.
    Ответ написан
    2 комментария
  • Почему WinExec не открывает программу exe Windows 7 (64 Бит) выходит ошибка 2?

    @Mercury13
    Программист на «си с крестами» и не только
    Я креветко. Не работает вот почему: вы решили отказаться от стандартных хедеров Windows и неверно указали соглашение вызова.
    #include <windows.h>
    
    int WINAPI WinExec(string lpCmdLine,int uCmdShow);

    Чему равняется макрос WINAPI — зависит от компилятора.

    Что писать в CreateProcess, если что…
    #include <windows.h>   // убирай этот kernel32.dll
    
    STARTUPINFO si;
    PROCESSINFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    si.wShowWindow = SW_SHOWDEFAULT;
    
    CreateProcess(NULL, L"c:\\AlertMailer.exe", NULL, NULL, false, 0, NULL, NULL, &si, &pi);
    // Мы не ждём ничего от программы — шшас закроем.
    // Если хотите дождаться — WaitForSingleObject(hProcess, INFINITY);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    );
    Ответ написан
    Комментировать
  • Как освободить память в java?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Самое простое. var = null; Если нужно ещё и мусорщика пустить — ну пусти, System.gc();
    2. Если нужно, чтобы объект не удерживался — WeakReference. Как только объект исчезнет, слабая ссылка перещёлкивается в null. Бывает нужно: 1) если объекты-дети переживают своих владельцев, и при этом потерять владельца — это несмертельно; 2) когда строим какой-нибудь временный список.
    3. Не выдавать безымянный объект наружу, если он переживает создателя. В безымянных объектах есть ссылка на создателя. Выдавать лямбду: если создатель не нужен, ссылки никакой не будет.
    4. Аналогично с внутренними классами — если он переживает создателя, делай его static.
    5. String.intern, если вы работаете с кучей мелких одинаковых строк. Ну или наладить свой кэш :)
    6. Использовать объектные пулы и прочие структуры, снижающие нагрузку на мусорщик.
    7. Разбивая строки на мелкие кусочки, использовать паттерн doSomething(String data, int start, int length), не вытягивая подстроку физически. Использовать StringBuilder.
    Ответ написан
    1 комментарий
  • Код из Delphi в С++!?

    @Mercury13
    Программист на «си с крестами» и не только
    InStr/InSize — немного избыточно по дельфийским меркам и можно преобразоватть в const char* data / size_t length.

    Результат — ну std::string, разумеется. Или std::vector<char>. Что вместо SetLength — читай доку.

    InStr[i + 1] → data[i]. Остальные массивы нумеруются с нуля, всё как и было.

    Inc(j) → ++j.

    Мне кажется, этот код механически переписывался с Си на Паскаль и переписать обратно будет несложно.

    Ещё тут магическое число 16 — догадайся, на что заменять. Кстати, не стоит размазывать по коду две строки, связанные с j.
    Ответ написан
  • Низкочастотный писк монитора LG 29uc88, в чем дело?

    @Mercury13
    Программист на «си с крестами» и не только
    Если монитору несколько лет — тащите в ремонт (или сами перепаивайте, если способны). Отказывают конденсаторы в блоке питания. Стандартная дешёвая поломка, в Киеве 30$ (плюс-минус). Если глюк повторяется через силу — запишите на флэшку ту картинку, где это добро проявляется.
    Если новый — тыкайте сервис-центр носом в проблему. Явно питальник без запаса сделали — и из-за дефектов производства где-то чего-то не хватило по параметрам, и начало пищать.
    Ответ написан
  • Как быть с реестром (пишет в WOW64)?

    @Mercury13
    Программист на «си с крестами» и не только
    Так надо, у W32 и W64 разные места в реестре. И в 90% случаев ничего не надо делать.
    Но иногда всё-таки приходится, например:
    • Есть проги для W32 и W64, и хотелось бы иметь общие настройки.
    • Прога для W32 читает чужие настройки от проги для W64, и наоборот.
    • У вас программа, оперирующая реестром: редактор, чистильщик, архиватор…
    Тогда вот дока от M$, объясняющая всё это.
    https://msdn.microsoft.com/en-us/library/windows/d...

    P.S. «Работает с реестром» — это пишет свои настройки в реестр или действительно оперирует реестром, типа редактора или чистильщика реестра?
    Ответ написан
    2 комментария