• Убрать указание размера функции?

    @Mercury13
    Программист на «си с крестами» и не только
    Зависит от того, чем линкуете.
    Если вызываете напрямую ld — --kill-at.
    Если gcc — то -Wl,--kill-at вроде.
    Ответ написан
  • Как декодировать UTF-16 на С++?

    @Mercury13
    Программист на «си с крестами» и не только
    Это не Паскаль, это типизированный Бейсик.
    Вот мой рабочий код — каждый вызов читает одну кодовую позицию, перемещая первый указатель на нужное кол-во слов вперёд. Переведёшь в нужные тебе соглашения по работе? — например, ты можешь читать информацию не из памяти, а из файла или ещё откуда-то.
    enum {
        SURROGATE_MIN = 0xD800,
        SURROGATE_MAX = 0xDFFF,
        SURROGATE_LO_MIN = SURROGATE_MIN,
        SURROGATE_HI_MIN = 0xDC00,
        SURROGATE_LO_MAX = SURROGATE_HI_MIN - 1,
        SURROGATE_HI_MAX = SURROGATE_MAX,
        UNICODE_MAX = 0x10FFFF,
        U8_1BYTE_MAX = 0x7F,
        U8_2BYTE_MIN = 0x80,
        U8_2BYTE_MAX = 0x7FF,
        U8_3BYTE_MIN = 0x800,
        U8_3BYTE_MAX = 0xFFFF,
        U8_4BYTE_MIN = 0x10000,
        U8_4BYTE_MAX = UNICODE_MAX,
        U16_1WORD_MAX = 0xFFFF,
        U16_2WORD_MIN = 0x10000,
        U16_2WORD_MAX = UNICODE_MAX,
    };
    
    #define CHAR_BOM L'\uFEFF'
    
    #define UNICODE_NONE (0xFFFFFFFFUL)
    #define UNICODE_BAD  (0xFFFFFFFEUL)
    
    unsigned long str::getCp(const uint16_t*& aCurr, const uint16_t* aEnd)
    {
        if (aCurr == aEnd)
            return UNICODE_NONE;
        unsigned long cp = *(aCurr++);
        if (cp < SURROGATE_HI_MIN) {
            if (cp < SURROGATE_MIN) { // Low BMP char => OK
                return cp;
            } else {  // Leading surrogate
                if (aCurr == aEnd)
                    return UNICODE_BAD;
                unsigned long trailing = *aCurr;
                if (trailing < SURROGATE_HI_MIN || trailing > SURROGATE_HI_MAX)
                    return UNICODE_BAD;
                ++aCurr;
                return (((cp & 0x3FF) << 10) | (trailing & 0x3FF)) + 0x10000;
            }
        } else {
            if (cp <= SURROGATE_MAX) { // Trailing surrogate
                return UNICODE_BAD;
            } else { // High BMP char => OK
                return cp;
            }
        }
    }


    Параметры: первый (передан по сцылке) — подвижная «каретка», второй указывает за конец строки.
    Возвращает: NONE, если читать больше нечего, BAD, если считал херню, и кодовую позицию — если таковая всё-таки считалась.

    Алгоритм: читаем слово. Двумя сравнениями относим его к одному из четырёх диапазонов: 1) нижний диапазон базовой плоскости, 2) нижний суррогатный символ; 3) верхний суррогатный символ; 4) верхний диапазон базовой плоскости. Если 1 или 4, так его и возвращаем, если 3 — видим херню.

    Если же 2, считываем слово, не смещая каретки. Если слово не верхний суррогатный символ — херня. В противном случае смещаем каретку и собираем номер кодовой позиции.
    Ответ написан
  • Не могу понять принцип округления float point, объясните на примере цифры?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Округление к чётному. Это стандартное округление к ближайшему; если расстояние одинаково — то к чётному.
    4,4 → 4
    4,5 → 4
    4,6 → 5
    −4,4 → −4
    −4,5 → −4
    −4,6 → −5
    5,4 → 5
    5,5 → 6
    5,6 → 6
    −5,4 → −5
    −5,5 → −6
    −5,6 → −6

    2. Округление вниз к −∞. Округление к меньшему.
    4,xxx → 4 (при любой дробной части)
    −4,xxx → −5

    3. Округление вверх к +∞. Округление к бóльшему.
    4,xxx → 5
    −4,xxx → −4

    4. Отбрасывание дробной части. Округление к 0. Округление к меньшему по модулю.
    4,xxx → 4
    −4,xxx → −4

    Столько много знаков у double — так что где-то в недрах библиотеки float стал double’ом. Знаков у float не точно 7, а чуть больше семи. И это число действительно не тройка: тройка имеет 16-й вид 4040.0000, а ваше число — 403F.FFFF. Как вы видите, величина единицы младшего разряда (ULP) на таких величинах будет около 2,4·10−7 — поболее семи знаков будет, но до восьми не дотягивает.

    Механизмы округления IEEE 754 не имеют никакого отношения к десятичному округлению, прописанному в библиотеке языка. Округление IEEE на самом деле двоичное и используется при переводе из более точного типа в менее точный, или чтобы округлить результат умножения/деления.
    Ответ написан
  • Как найти машинную бесконечность?

    @Mercury13
    Программист на «си с крестами» и не только
    Важный вопрос: есть ли неявная единица и денормализованные числа?
    Считаем, что всё-таки есть, порядок несмещённый, записан дополнительным кодом, денормализованное число записывается 10…00 в порядке. (А то всяко бывает, в нашем родном float порядок смещён на 01…11).
    Тогда максимальное число, которое можно записать, равняется 1,1…1112·22^13−1.
    Ну а бесконечность — примерно 2·22^13−1 = 22^13.
    Wolfram Alpha говорит, что это 1,091·102466.
    Ответ написан
  • Что такое поля кольца и группы в алгебре?

    @Mercury13
    Программист на «си с крестами» и не только
    Всё просто. Чтобы проверить, что это группа, надо убедиться.
    1. Ассоциативна ли? a•(b•c) = (a•b)•c
    2. Замкнута ли? a•b также входит в множество.
    3. Есть ли ноль/единица?
    4. Есть ли противоположный/обратный элемент относительно этой операции?

    Например: 5) Неотрицательные целые относительно сложения. Очевидно, противоположный элемент — −x — не всегда есть.
    7) Целые числа относительно вычитания. Не ассоциативна: a−(b−c) ≠ (a−b)−c.
    8) Нечётные числа относительно сложения. Не замкнута: 3+5 = 8
    Ответ написан
  • Не могу понять почему пишет функция перегружаная 1 ошибка?

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

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

    В ООП точно так же, как в процедурном, и делай; дополнительный вопрос — как быть, если в одном списке могут быть объекты разных типов. Например, можно делать std::vector<std::unique_ptr<SomeBase>>.
    Ответ написан
  • Используются ли рекурсивные алгоритмы в олимпиадах по программированию?

    @Mercury13
    Программист на «си с крестами» и не только
    В разы, но не на порядок. Скорее всего, задача впишется в ограничение по времени.

    Дополнение. О рекуррентных соотношениях я говорю, что методы решения от лучшего к худшему такие:
    1. Преобразовать соотношение так, чтобы получить меньшую глубину рекурсии или даже прямое вычисление.
    2. Динамическое программирование — если мы способны восстановить порядок вычисления и при этом не наделать много лишних вычислений.
    3. Рекурсивное с доказательством, что одно и то же дважды не вычислим.
    4. Рекурсивное с кэшированием.
    5. Рекурсивное какое попало.

    Кроме того, динамическое программирование на ациклическом направленном графе общего вида будет, скорее всего, рекурсивным, и переписывание его под программный стек будет даже медленнее!
    Ответ написан
  • Мерцает экран ноутбука Что делать?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое подозрение на шлейф монитора. Второе на видеочип. Тащите к ремонтникам, разумеется.
    Ответ написан
  • Какая разница между спецификатором, модификатором, квалификатором, идентификатором, инициализатором?

    @Mercury13
    Программист на «си с крестами» и не только
    Спецификаторы определения — слова typedef, inline, friend, constexpr, constinit, register, static, thread_local, extern, mutable.
    Спецификаторы типа — что угодно, что полностью определяет тип: начиная от int и заканчивая vector<int>::const_iterator.
    Модификаторы типа — слова short, long, signed, unsigned.
    Квалификаторы — слова const, volatile.
    Спецификаторы доступа — слова private, protected, public.
    Идентификатор — имя объекта, подчиняющееся определённым правилам.
    Объявитель — это часть объявления переменной или функции, и если ты не лезешь с головой в тонкости синтаксиса Си, тебе не надо.
    Инициализатор — это int i = 1 или int i {1}.
    Ответ написан
  • В каком случае программа выдает ложный результат?

    @Mercury13
    Программист на «си с крестами» и не только
    T = 4, X = 2, N = 1. Получаются 2 минуты, хотя надо четыре.
    Надо не ceilDiv(nt, x), a t·ceilDiv(n,x).
    Ну и с такими ограничениями ceilDiv(n, x) = (n + x - 1) / x, без дробной арифметики.
    (Собирая всё в одно выражение, не забывайте скобки!)
    Ответ написан
  • Если какие-либо профессиональные курсы по разработке браузеров?

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

    1. Браузерный движок. В настоящее время движков раз, два и обчёлся, и ты НЕ СДЕЛАЕШЬ хороший движок. И я не сделаю — если уж M$ и Opera отказались. Удивляюсь, как Рыжая держится — держу её за старый GDI’шный рендеринг текста, иначе давно бы перешёл на Вивальди. Единственное, что иногда бывает нужно,— небольшой неполнофункциональный движок, совместимый в первую очередь с самим собой (например, чтобы отформатировать текст в интерфейсе программы).

    2. Браузер на существующем движке. А это больше вещь из бизнеса, чем из программирования. А именно — откуда брать деньги и что предложить такое, чего нет у других. Допустим, M$ и Гугл перенаправляют на собственные поисковые системы. Ну а распространении «в придачу» и говорить нечего. Из уникальных фишек у Яндекса обход украинских запретов, у Вивальди — неплохая копия старой Оперы на новом движке.

    Кроме того, есть такая штука, как Google Widevine — инфраструктура раздачи шифрованного контента, которой пользуются все клоны Хрома и Рыжая. В принципе, без неё можно, вот только Нетфликс не посмотришь — можно и свою написать, только как убедить Нетфликс ею пользоваться?
    Ответ написан
  • Как отсортировать вектор по одному из элементов структуры?

    @Mercury13
    Программист на «си с крестами» и не только
    std::sort(thrusters.begin(), thrusters.end(), 
        [](const calcThrusterType& x, const calcThrusterType& y) {
            return (x.angle < y.angle);
        });

    Вы используете typedef и в вашем компиляторе нет Си++11?
    bool angleLess(const cTT& x, const cTT& y) { return x.angle < y.angle; }
    
    std::sort(thrusters.begin(), thrusters.end(), angleLess);
    Ответ написан
  • Какую IO задержку добавляет KVM switch?

    @Mercury13
    Программист на «си с крестами» и не только
    0,2 мс — и у монитора, и у клавы, и у мыши задержки куда больше. У клав и мышей — от 1 до 8 мс.
    Один товарищ насчитал, что от мыши до экрана задержка 15…33 мс, среднее 24: https://www.youtube.com/watch?v=nbu3ySrRNVc
    Простой KVM с дальностью в пару метров в большинстве случаев не создаёт никакой задержки. Не знаю, что там с видеопротоколами, но диалоговая работа USB с его таймслотами подсказывает: если будем создавать задержку, не заработает.
    Иногда встречаются глюки с конкретной железкой на KVM, но это уже труднопредсказуемо.
    Ответ написан
  • Где у меня может быть ошибка в нахождении площади сложной фигуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Обсуждение было в комментах, и ключевая причина — при comp_a < 0 корни не сортируются.

    Побочные проблемы кода.
    1. Можно было интеграл разности, а не разность интегралов.
    2. Лучше не использовать vector и pair на месте struct { a, b, c } — кроме случаев, когда есть важная автоматизация.
    Ответ написан
  • Как ускорить решение на c++?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы тут что-то ухитрились написать, но всё равно n². Потому и TL.

    Пусть для каждого поддона длина — большее из измерений, ширина — меньшее. Теперь условие «поддон А можно поставить на поддон Б» упрощается.

    Очевидно, что поддоны, которые нельзя поставить друг на друга, будут возрастать по одному измерению и убывать по другому. (Иначе мы сортанём по длине, по ширине тоже обнаруживаем неубывание — и, сюрприз, эти поддоны становятся!)

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

    Нам приходит новый поддон. Упорядочиваем координаты, затем ищем в списке equal_range по длине.

    Для «БОЛЬШЕЙ» части списка [LOWER_bound, end): наш поддон можно поставить на все эти поддоны по длине, и только на первые из них — по ширине. Если l_b=end, или наш поддон не встаёт на *l_b — добавляем поддон в список. Но не сразу, а после проверки меньшей части.

    Для «МЕНЬШЕЙ» части списка [begin, UPPER_bound): все эти поддоны можно поставить на наш поддон по ДЛИНЕ, и только некоторый хвост [some_pallet, upper_bound) — по ширине. Находим этот кусок и исключаем из дерева.

    А теперь вопрос: как хакнуть наш set, чтобы можно было проводить поиск за log n и по длине, и по ширине?
    А для этого пишем свой объект-сравниватель, который можно переключать между двумя вариантами: length1<length2, либо width1>width2;

    P.S. Не очень понятно условие «один поддон становится на другой» — ни из описания, ни из примера. Мой алгоритм — length1 <= length2, width1 <= width2. Если, например, оба строго меньше (length1 < length2, width1 < width2) — то большая часть будет [u_b, end), меньшая — [begin, l_b), и из-за непересечения этих частей не обязательно добавлять в список отложенно.
    Ответ написан
  • Как перенести структуру в бинарный файл что бы он мог его прочитать без повреждения файла?

    @Mercury13
    Программист на «си с крестами» и не только
    Начнём с 2. Структуры, используемые как формат файла, применяй в прикладном коде с большой осторожностью. Если хочешь, чтобы формат расширялся, придумай простенький блочный формат.
    Для 1 — приходится использовать какую-то сигнатуру и находить её в файле.
    Например: после собственно EXE-файла идут данные, потом сигнатура и положение данных в файле. Сигнатуры нет или смещение странное — значит, просто приклеивай всю эту дрянь в конец файла. Сигнатура есть и смещение правдоподобное — идём по указанному смещению, пишем новые данные вместе с новой сигнатурой, а потом усекаем файл (на случай, если старые данные были длиннее).
    На этом принципе, кстати, основаны самоизвлекающиеся архивы RAR и RARJPEG — только сигнатура в начале, а не в конце RAR-данных.
    Ещё нужно проверить, в какой кодировке ifstream принимает данные — UTF-8 или Win-1251. Начиная с Си++17 появилась поддержка юникодных имён файлов, но я с нею не работал.
    Ответ написан
  • Редизайн книги для портфолио нарушение авторских прав?

    @Mercury13
    Программист на «си с крестами» и не только
    Нарушением не будет, пока ты не займёшься распространением собственно альбома.
    Всё, что ты дерёшь,— это тривиальную информацию: название альбома и список песен.
    Ответ написан
  • Возможно ли в процедурном программирование, имитировать ООП?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно, и я бы посоветовал посмотреть на две вещи.
    1. MiniZip. Настоящие виртуальные потоки, написанные на чистом Си!
    Кстати, у нас на работе есть библиотека MiniZipPort, представляющая собой тупой перевод MiniZip на виртуальные потоки и шаблонные контейнеры — две строчки Си превращались в одну строчку на «крестах». К тому же для хранения каталога я использовал уже имевшийся самописный AccuStream (что-то вроде std::deque, только в виде потока).
    2. Doom. Самый первый, 1993–94 года. Там тоже ухитрились делать объектно — правда, другими методами.
    Ответ написан