Задать вопрос
  • Какие данные приходят на устройство через COM-порт, если отправить "1"?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами такая конструкция
    0 . 1000 . 1100 . 1 . 0 . 0101 . 0000 . 1
    Каждый байт начинается стартовым битом 0 и кончается стоповым битом 1. Передаётся, начиная с младшего бита.
    Итого два байта, 31+0A, или "1" + LineFeed.
    Ответ написан
    9 комментариев
  • Как найти координаты прямой d, направленного по биссектрисе угла между двумя прямыми, при условии, что длина бисс прямой с задается с клавиатуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Как я понял, задача такова. Есть угол, заданный вершиной и двумя точками на сторонах. Найти, куда попадёт биссектриса длины 4.

    1. Из координат вершины угла и точек на его сторонах получить векторы-стороны.
    2. Привести векторы-стороны к единой длине (например, разделить на длину).
    3. Их среднее арифметическое — вектор-биссектриса. Если получился нулевой вектор — векторы-стороны смотрят на 180°, и непонятно, в какую сторону считать нашу биссектрису.
    4. Привести вектор-биссектрису к нужной длине (разделив на реальную длину и умножив на требуемую).
    5. Отсчитать этот вектор от вершины угла. Получится координата биссектрисы длины 4, отложенной от точки (3, 4).
    А математика совсем не высшая :)
    Ответ написан
    Комментировать
  • Как сделать двухстрочную шапку в таблице в С++ Builder?

    @Mercury13
    Программист на «си с крестами» и не только
    Нельзя, я использовал компонент KGrid.
    Ответ написан
    Комментировать
  • Лучше ли книги онлайн - курсов?

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

    Печатный материал лучше.
    1. Когда нужно посидеть и осознать. Первые шаги в вашем первом языке программирования, когда даже синтаксис стена. Практически всё, что относится к алгоритмам.
    2. Работа с низкоуровневыми библиотеками наподобие OpenGL или SDL, которые производят кучу кода.
    3. Небольшой справочник.
    Ответ написан
    Комментировать
  • Почему данный код блокирует UI?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что OpenFileDialog модальный.
    Добавили ключевое слово async и ждёте другого поведения стандартного диалога Windows?
    Ответ написан
  • Как пропустить весь поток для того, чтобы можно было воспользоваться getchar()?

    @Mercury13
    Программист на «си с крестами» и не только
    fflush(stdin);

    Но такое поведение «новодел» и не заспецифицировано жёстко. В Windows работает, в Linux, говорят, тоже, а в BSD и его производных (Mac) — уже нет.

    Кто-то подсказывает такую штуку
    if ( ferror( stdin ) || feof( stdin ) )
        clearerr( stdin );
        else rewind( stdin );
    Ответ написан
    2 комментария
  • Как определить метод класса, чтобы объект в него передавался не по ссылке?

    @Mercury13
    Программист на «си с крестами» и не только
    UPD. Теперь понял, о чём вы. В таком виде нельзя.
    Ответ написан
  • Почему a=1, i=1, j=2?

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

    i = 1
    1 || ? = 1,
    j++ не вычисляется вообще.
    Ответ написан
    Комментировать
  • Режим работы из массива в одну строку?

    @Mercury13
    Программист на «си с крестами» и не только
    Скажем прямо: данная конструкция работает только если выходные дни в начале или конце недели. Если в середине — придётся расширять алгоритмы, да и труднолокализуема (языковые строки одновременно служат техническими ключами).

    Заводим три переменных: firstDay, lastDay, workHours. Поначалу они пустые строки.
    Проходимся по всем элементам.
    • Если рабочие часы совпадают с workHours — перезаписываем lastDay, и всё.
    • А если нет — проводим функцию dump, перезаписываем все три.
    После цикла принудительно проводим dump.

    Как должна работать функция dump.
    • Если workHours пусто — ничего не делаем.
    • Если результирующая строка непуста — добавляем разделитель.
    • В зависимости от того, совпадают ли firstDay и lastDay, добавляем «Пн» или «Пн-Пт».
    • Ну и, наконец, добавляем рабочие часы.
    Ответ написан
    Комментировать
  • Что означает открыть/закрыть соединение и почему это операция дорогая?

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

    @Mercury13
    Программист на «си с крестами» и не только
    Кода нет даже игрушечного, и гарантированно не скажешь. Я вижу три возможных причины.
    1. Либо не прописан конструктор копирования или операции присваивания (а с деструктором всё в порядке). Указатели продолжают обращаться к освобождённой памяти, и по какому-то счастливому совпадению первый элемент совпадает.
    2. Либо конфликт имён: fn — параметр конструктора и fn — внутреннее поле.
    3. У вас тут закомментированное srand(time(NULL));. Я не знаю, что в функции random_at_most, но если там srand — перенеси его в другое место. Процессор работает в миллион раз быстрее, чем таймер. «Хочешь, чтобы было случайнее», а будут повторы.
    Ответ написан
    Комментировать
  • GetModuleFileNameA, в чем проблема?

    @Mercury13
    Программист на «си с крестами» и не только
    sz = strlen(szPath);
    Ну чему, блин, равняется sz?


    Return value

    If the function succeeds, the return value is the length of the string that is copied to the buffer, in characters, not including the terminating null character. If the buffer is too small to hold the module name, the string is truncated to nSize characters including the terminating null character, the function returns nSize, and the function sets the last error to ERROR_INSUFFICIENT_BUFFER.

    Вот оттуда надо брать длину. А не из strlen неинициализированной памяти.

    И идеалом было бы заложиться на пути длиннее MAX_PATH.
    Ответ написан
    Комментировать
  • Как включить Юникод на Qt ODBC?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Решение простейшее: установить свежий драйвер. В нём давно всё исправлено.
    Ответ написан
    Комментировать
  • Как работать со строковыми матрицами?

    @Mercury13
    Программист на «си с крестами» и не только
    Простейший способ — отсортировать каждую строку обеих матриц. Строки, изначально являвшиеся анаграммами, будут совпадать, и теперь уже можно выяснять, что с чем совпадает. Сложность O(w·(hA+hB)·max{hA+hB, log w})

    Более сложный (лучше асимптотическая оценка). После того, как отсортировали каждую строку, строки матрицы B дополнительно переупорядочиваем в лексикографическом порядке (ААА < ААБ <…< ААЯ < АБА). Для поиска совпадений пользуемся двоичным поиском. Сложность O(w·(hA+hB)·log max{w, hA, hB}).

    Можно также каждой строчке матрицы B посчитать хэши и запомнить в какой-то структуре данных: хэш не совпал ни с чем — полное сравнение не проводится. Не улучшает оценки в худшем случае, но улучшает в среднем.

    Офтоп. Было дело, я оптимизировал WAD’ы Doom’а по размеру (формат позволял нескольким блокам ссылаться на один и тот же участок файла, а во многих модах — и даже в самом Doom’е — были повторы). Обошёлся хэшированием, и хэшем был размер + несколько байт из середины блока.
    Ответ написан
    Комментировать
  • Нужен ли бэк-энд для одиночной F2P игры?

    @Mercury13
    Программист на «си с крестами» и не только
    Рейтинг: рассчитывается по своим формулам и никак не стандартизируешь.
    Покупки: на это бэк-энд не нужен (хотя при желании можно тянуть информацию со своего сервера, а не с API покупок).
    Так что бэк-энд будет небольшой, ибо 99% работы на клиенте, но будет.
    Ответ написан
  • Как Работает вирус?

    @Mercury13
    Программист на «си с крестами» и не только
    Добавлю от себя.

    Сейчас вирусы на ассемблере пишут редко, и этому есть две причины.
    1. Сложная полезная вредная нагрузка: загрузка чего-то через Интернет, сетевые эксплойты, дистанционное управление.
    2. Сложный формат PE, крайне редкий обмен софтом, цифровые подписи на критических файлах и UAC. Потому встраиваться в файлы тяжело и малопродуктивно. UPD — существует немало «вирусов-спутников», но цифровые подписи на критических файлах и UAC не пробить и им.

    Эксплойту с внедрением кода нужно небольшое тело, и его пишут на ассемблере или Visual C. А если это обычный EXE/DLL — то на языке, для которого в ОС гарантированно есть runtime-среда. В основном Visual C и .NET старых версий.

    Вирусы, эксплуатирующие ошибки в runtime-средах (JS-движках, Java, .NET) — разумеется, на языке среды (JS/Java/C#). Если ошибка предполагает внедрение кода — см. выше.

    UPD2. Я не писал вируса, но как бы я его заставил работать?

    Прошёлся бы по дискам. Создал бы скрытую папку с микрософтоподобным именем и потихонечку бы шифровал в неё файлы. Вдруг в момент Икс я переименовываю исходные файлы в ту самую папку, затираю пару килобайт начала, переименовываю скрытые на их место и вывожу: ваш компутер зашифрован! Если человек мешкает — затираю остатки файлов, а потом и удаляю их.

    Остаётся придумать, как этот вирус протащить на компьютер жертвы и как прикинуться легитимной программой. Простейший вариант, по-моему — прикинуться сайтом программ, в каждую поместить вирус и сделать активное SEO. Что будет, когда попадусь — не знаю. А прикинуться программой — придумаю какую-нибудь службу-технотуфту от Microsoft. Хотя настоящие вирусописатели покупают на чёрном рынке эксплойты, я с этим делом не знаком.
    Ответ написан
    Комментировать
  • Как вывести самую большую цифру из номера в java?

    @Mercury13
    Программист на «си с крестами» и не только
    Разобрать по цифрам и сделать.
    Положительное число разбирают по цифрам так.
    while (n != 0) {
      digit = n % 10;  // делай с этой цифрой что хочешь
      n /= 10;
    }

    Куда пустить цифры и как сделать поправки на нули и отрицательные — думай сам.
    Ответ написан
    Комментировать
  • Как производить вычисления ip-адресов силами только sql?

    @Mercury13
    Программист на «си с крестами» и не только
    IpAddress & Mask = IpAddr
    (при условии, что IP гарантированно настоящий и не надо узнавать, это настоящий адрес или один из сервисных, связанных с сетью)
    Возможно — я не знаю, каких размеров таблица — БД держат в таком виде ради индексирования.
    Ответ написан
  • В группе вк 10319 человек. из них Московских 6.21%. Как мне вычислить точное число подписчиков из Москвы?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача, как ни странно, нетривиальна.
    Какой возможен процент, чтобы округление дало 6,21? От 6,205 до 6,215%.
    Минимальное число — 10319 * 6,205 / 100 = 640,29
    Максимальное — 10319 * 6,215 / 100 = 641,32
    Ответ однозначен, 641 человек.

    Будь округление более грубым — например, 6,2% — тогда было бы от 635 до 644.
    Ответ написан
  • На каком ал языке можно представить алгоритм перевода десятичных чисел в восьмеричные?

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