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

    @Mercury13
    Программист на «си с крестами» и не только
    В Си можно — 0123 = 1238. Но зачем оно тебе?
    Обычно число в любой позиционной системе счисления — 10-й, 8-й, 16-й — записывается в строчку. И я говорю не «перевод из 10-й системы в 8-ю», а «перевод из родной системы в восьмеричную» — потому что не важно, какая система родная, главное, что мы в ней умеем выполнять арифметические операции.
    Ответ написан
    Комментировать
  • Объясните толком про интерфейсы в ООП (Delphi). Как их использовать?

    @Mercury13
    Программист на «си с крестами» и не только
    Интерфейсы в Delphi отвечают за две малосвязанных вещи.
    1. Множественное наследование. Об этом уже рассказали до меня, повторяться не буду.
    2. Подсчёт ссылок (для этого реализатор должен корректно поддерживать _AddRef и _Release, но это уже другой вопрос, и подходящая реализация есть в TInterfacedObject).
    Связано это с тем, что Delphi должен был поддерживать Microsoft COM, а там автоматическое управление через подсчёт ссылок.
    Так что интерфейсы часто приплетают только потому, что удобно работать с подсчётом ссылок.

    Вот, например, моя библиотека (обёртка cURL для Delphi) под названием curl4delphi: https://github.com/Mercury13/curl4delphi
    На что тут ICurl? А на то, что это объект с подсчётом ссылок, и для него не надо вызывать деструктор. Пропадает последняя ссылка — объект исчезает. Вот и всё.
    Из-за автодеструкторов, «киллер-фичи» Си++, я в Си++ так не поступал бы.
    Ответ написан
    Комментировать
  • Как запустить на выполнение exсel файл из java?

    @Mercury13
    Программист на «си с крестами» и не только
    docs.oracle.com/javase/6/docs/api/java/awt/Desktop.html

    Как работает, не проверял.
    Ответ написан
    Комментировать
  • Что значит Buffered?

    @Mercury13
    Программист на «си с крестами» и не только
    ДЛЯ ВВОДА-ВЫВОДА: Он читает информацию большими кусками и хранит эти куски в памяти.
    Служит для ускорения доступа, если на самом-самом высоком уровне файл надо читать по одному байту или символу, а на самом-самом низком (например, жёсткий диск) эффективнее это делать блоками по 4K.

    У читателей flush (если таковой есть; у BufferedReader, например, его нет) служит для потоков реального времени: клавиатуры, коммуникационных портов и прочего. Всё, что накопилось в буфере, сбрасывается, и считается, что на момент T поток пуст.

    Писатели, естественно, пишут данные не сразу, а когда буфер заполнится, и авария программы или перебой электричества эти данные похѣритъ. Для них команда flush физически записывает накопленные данные.

    ДЛЯ КАРТИНОК: Картинка хранится не в «аппаратно-эффективном» виде, а в таком, чтобы пользователь мог её относительно просто менять.
    Ответ написан
    Комментировать
  • Соединение точка-точка через интернет?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ЗЫ. На резисторах, конденсаторах и прочих пассивных не получится: нужен активный элемент, т.е. который умеет управлять потоками энергии, а не только рассеивать или накапливать. На диодах, думаю, можно, но тяжело.
    Ответ написан
    Комментировать
  • Как "устроены" 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)

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

    Более простой способ, который вам может подойти — запретить все суррогатные пары.
    Ответ написан
  • Почему 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 комментарий
  • Стоит ли вынести объявление типов в отдельный файл?

    @Mercury13
    Программист на «си с крестами» и не только
    Стоит!
    Назовите этот хедер как-нибудь defines.h
    Ответ написан
    Комментировать
  • Как сделать скриншот определенной программы на java?

    @Mercury13
    Программист на «си с крестами» и не только
    colororacle.org
    Вот тут опенсорсный симулятор дальтонизма на Java. Делает снимки всего экрана; как — посмотрите в исходники.

    Сомнительно, что получится на Java кроссплатформенно сделать снимок отдельной программы — больно уж системная штука.

    P.S. Для скриншотов используется класс, именуемый «тестирующий робот» — скриншот-то им можно сделать, а вот как получить прямоугольник чужого окна? По-видимому, только через native-обёртку.

    P.P.S. Оказывается, и native-обёртка есть — JNA. С ней никогда не работал.
    Ответ написан
    Комментировать
  • Почему ошибка в netbeans c++?

    @Mercury13
    Программист на «си с крестами» и не только
    В одном проекте два CPP-файла: int_float.cpp и hello.cpp. В обоих по main’у.
    Я не знаю, как NB объединяет файлы в проект, но если всё, что в каталоге и подкаталогах — значит, не держи где-то в подкаталогах другой проект.

    Второй вариант — очистить временный каталог с .o-файлами; там, возможно, завалялось что-то старое.
    Ответ написан
    Комментировать
  • Как можно реализовать?

    @Mercury13
    Программист на «си с крестами» и не только
    Подсчитать кол-во нулей (единиц, двоек, троек). Если неодинаково — нельзя.
    Иначе — подсчитаем такую матрицу (4×4). Если в 1-й строке на i-м месте 1, а во 2-й 3, прибавляем единицу к a[1, 3].
    a[i, i] не учитываем: они уже на своих местах.
    a[i, j] и a[j, i] взаимокоменсируем: каждая такая парочка даёт min(a[i, j], a[j, i]) перестановок.
    Точно так же пересматриваем все тройки a[i, j], a[j, k] и a[k, i]. Как всегда, взаимокомпенсируем их; каждая такая тройка даёт 2·min(•, •, •) пререстановок.
    Остаётся просуммировать всё, что осталось (кроме диагонали, разумеется), и помножить на 3/4.
    Ответ написан
    Комментировать
  • Как правильно организовать структуру в классе?

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

    1. Как устроить данные?
    struct CheckLine {
    public:
       int itemCode;    // код товара
       int qty;         // количество
       int price;       // цена, по которой всё это продано в копейках
       const CheckLine* next() const { return _next; }
    private:
       friend class Check;   // я тут ошибся с const-корректностью и заconst’ив всё, что можно, не дал Check’у писать
       CheckLine* _next;
    }
    
    class Check {
    public:
        Check() : _firstLine(NULL), _lastLine(NULL) {}
        void addLine(int itemCode, int qty, int price);   // пиши реализацию сам.
        const CheckLine* firstLine() const { return _firstLine; }
        ~Check();  // не забудь про деструктор…
        Check(const Check&)  // …конструктор копирования…
        Check& operator = (const Check&);  // и операцию «присвоить».
    private:
        CheckLine *_firstLine, *_lastLine;
    }

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

    2. Во внутренней кухне класса ты обращаешься к консоли. Зачем? Обычно это делают как можно ближе к main.

    Вернусь — буду писать дальше.
    Ответ написан
    3 комментария
  • Что значит последовательный участок памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    Один последовательный участок памяти — это значит «последовательные адреса памяти». Таковыми будут массив простой и динамический, строка традиционного устройства, и все структуры памяти, что на них основаны. В том числе простейший стек и кольцевая очередь.

    Для чего это нужно?
    1. Это ближе к железу: проще код, лучше работает кэш, а значит, быстрее.
    2. Некоторые функции, особенно нешаблонные, для своей работы требуют именно последовательных ячеек памяти.

    Но если я реализую стек через список, разве это не будет противоречить сказанному?

    Совершенно верно, будет. Отсюда и знаменитая ошибка «переполнение стека» — непонятно, как наладить стек вызовов бесконечной ёмкости и относительно простого устройства. Потому, если нужна очень глубокая рекурсия (например, при обходе сетей), стек вызовов приходится эмулировать.
    Ответ написан
    7 комментариев
  • В чем заключается проблема с кодировкой на хостинге?

    @Mercury13
    Программист на «си с крестами» и не только
    $resultData = mb_convert_encoding($resultData, 'Windows-1251', 'UTF-8');

    Думаю, автодетекция кодировки заглючила.
    Ответ написан
    2 комментария
  • Для чего используются "методы по умолчанию" на практике?

    @Mercury13
    Программист на «си с крестами» и не только
    Это приближает интерфейсы Java к примесям.

    1. Очень часто бывает, что у какой-то функции есть реализация, опирающаяся на другие функции — либо базовая неоптимальная, либо вообще единственно возможная. Чаще всего это избыточные функции-утилиты. Пишу на Си++
    class Stream {
    public:
      virtual void write(size_t length, const void* data) = 0;
    
      // пишет в поток word в машинном порядке байтов
      void writeW(uint16_t data) {
        write(2, &data);
      }
    };

    За что вообще так ненавидят множественное наследование? За дублирование данных! Вот у нас некая штука, без единого поля данных — почему в Java она класс, а не интерфейс?

    2. Какую-то функцию переопределяют настолько редко, что лучше сделать ей реализацию на месте. Опять Си++.
    class ErpConnector {
    public:
      // 80% модулей не могут экспортировать данные в систему управления
      //   предприятием — напишем базовую реализацию.
      virtual bool canExportData() const { return false; }
      virtual void exportData() const {}
    };


    3. И просто документирование, как оно должно себя вести :) Из реального проекта, снова Си++.
    void im::DateGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
    {
        aDate = toDate(toInt(aDate, aStart), aStart);
    }

    Класс служит для группировки дат в периоды (недели, месяцы, годы). aStart — это дополнительный int, позволяющий начать год с февраля или месяц с 15-го. Эта функция переводит дату «на месте» в первую дату периода. Она крайне неоптимальна (дату в число, затем число опять в дату) и потому переписана почти во всех в реализациях.
    void im::MonthGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
    {
        if (aDate.day < aStart)
            aDate.addMonthsMechanical(-1);  // механически вычесть 1 месяц; дата может стать неверной.
        aDate.day = aStart;
        aDate.fixupTo1();    // неверную дату привести к 1-му числу следующего месяца
    }


    Но по крайней мере понятно, как она должна работать.
    Ответ написан
    Комментировать
  • Что это означает?

    @Mercury13
    Программист на «си с крестами» и не только
    Это дело у вас на компьютере. L2TP — это самый простой вид туннелирования, некогда популярный в домосетях. Локальный трафик был бесплатный, интернет — дорогой, и надо сделать, чтобы интернет включался и выключался по желанию пользователя. Для этого у пользователя были два соединения: локальная сеть и VPN, и таблицей маршрутизации указывалось, какой трафик идёт в локальную, а какой — в VPN.
    Что наш L2TP делает сейчас, в 2016-м — я не знаю. Может, действительно кто-то на вашем компьютере скрывался от РКН…Правда, для этого ещё надо включить IPSec, 12 лет назад этого просто не было.
    Ответ написан
    Комментировать
  • Как округлить число до 2-3 знаков после запятой на "pascal.A.B.C" если выдается ошибка?

    @Mercury13
    Программист на «си с крестами» и не только
    Обычно в учебных работах (и даже не в учебных — именно так работает Excel) не округляют, а выводят с округлением.
    writeln(x1:0:3);
    writeln(x2:0:3);

    Каких-то продвинутых средств округления, которые округляют дробное число до i-го знака я не вижу.
    Кроме того, вы подсказали, с каким Паскалем вы имеете дело, я загрузил его и повторил прошлую ошибку — такая ошибка происходит именно что из-за округления NaN.
    Ответ написан
    Комментировать