Задать вопрос
  • Как посчитать математические градусы?

    @Mercury13
    Программист на «си с крестами» и не только
    А арктангенс надо брать arctg((200−100)/(200−100))
    Кроме того, для этого есть функция atan2, определённая для всех x и y, одновременно не равных 0.
    Ответ написан
    4 комментария
  • Как переписать данный код?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы предложил поискать в коде ошибку, есть большое подозрение — первым множителем так и просится size. Ну или деление size %/ msize — невозможно сказать. Ну или условием будет не меньше, а больше или больше-равно. Но будем работать как есть.

    int v = msize / size;
    if (i < msize % size) ++v;
    int teqportion = msize * v;


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

    @Mercury13
    Программист на «си с крестами» и не только
    Java.
    «Технологии» вам не нужны, вам нужно программить что-то минимально действующее. А в Си++ слишком легко «выстрелить в ногу».
    А когда научитесь программить — тогда и Си (с крестами и без) станет понятнее.
    Ответ написан
    Комментировать
  • Можно ли удалить пробелы в начале и в конце строки без создания нового массива?

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

    Если предположить, что текст " ab " находится в «куче» — эта самая куча является сложной структурой данных и память выделяется с выравниванием. Потому функция realloc может (но не обязана) отдать конец или приделать память к концу. Отдать начало будет сложнее, и ни одна известная мне библиотека функций на это не способна.

    Кроме того, Си++ придумал объект string_view именно для этого — чтобы передавать строки в функцию, абстрагируясь от выделения памяти и даже от оконечного нуля. Потому у string_view нет функции c_str().

    Разумеется, вы можете сделать что-то вроде
    char* str2 = str + 2;
    str2[2] = '\0';
    // А str оставь, уничтожать как-то придётся

    Разумеется, если str находится в куче. Сегмент с литералами, напоминаю, только для чтения, и в ОС вроде DOS, где менять можно, такая замена может вызвать нехорошие побочки.
    Ответ написан
    3 комментария
  • Как исправить ошибку в коде?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Op= излишня, такая конструкция сама себя присвоит. С деструктором аналогично.
    2. Op+ — лучше пользоваться исключениями.
    3. Странное у вас устройство матриц — и не совсем константные, и менять нельзя.
    4. A[i][j] = i; — возможен выход за пределы массива.
    5. Если вывод матриц многострочный — подобный вывод не слишком удачный.
    Ответ написан
    Комментировать
  • Аргумент типа char не совместим с параметром типа const char*. Как исправить?

    @Mercury13
    Программист на «си с крестами» и не только
    Если вы узнали, что символ — цифра, просто вычтите из него '0'.
    meow[i] = gug[i] - '0';

    if (digit == true) не рекомендую писать, надо просто if (digit).
    Ответ написан
    Комментировать
  • Можете помочь с алгоритмом сортировки?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Вам свезло, что длина массива — ровно 8, то есть степень двойки. Ваш алгоритм никак не приспособлен к тому, что на очередном шаге длина массива окажется нечётной.
    2. Я не знаю, как происходит слайсинг массивов и передача параметров в Go, но надо проверять, насколько много перевыделения лишней памяти.
    3. Опять свезло — левая и правая половинки расходуются очень равномерно: один слева — один справа. Если взять отсортированный массив { 1, 2, 3, 4, 5, 6, 7, 8 }, когда сначала расходуем левую половинку, потом правую — должно заглючить. На самом деле слияние массивов содержит ещё больше всяких условий, и на каждом сравнении мы кладём в результирующий массив не два элемента из разных массивов, а один — меньший. И соответственно сдвигаем один из индексов-кареток.
    Ответ написан
    3 комментария
  • Убрать указание размера функции?

    @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.
    Ответ написан
    5 комментариев
  • Не могу понять почему пишет функция перегружаная 1 ошибка?

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

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

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

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

    @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}.
    Ответ написан
    2 комментария
  • В каком случае программа выдает ложный результат?

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

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

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

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

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

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять вынужден сам отвечать.
    Win32: Кто вызвал программу?
    Ответ написан
    Комментировать
  • Как отсортировать вектор по одному из элементов структуры?

    @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);
    Ответ написан
    1 комментарий
  • Где у меня может быть ошибка в нахождении площади сложной фигуры?

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

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