Ответы пользователя по тегу C++
  • Сделать трассировку кода по примеру на картинке с++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужен еще один аргумент. Типа глубина рекурсии чтоб делать отступы. Ну и внутри функции печатать на экран. Чем больше level тем больше отступ от левого края.

    int translateNumberSystem(int num, int p, int level)
    {
        if (num == 0)
        {
            return 0;
        }
        return (num % p + 10 * translateNumberSystem(num / p, p, level + 1));
    }
    Ответ написан
  • В чем может быть проблема если выдает такую ошибку?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно проверить все обращения к векторам

    vector<vector<int>> matrix;
    vector<int>res;


    по индексу. Используется больше элементов чем выделено.

    Автор и не жди решения на блюдечке. Давай начинай все проверять. Тестирование - это тоже активность разработчика и никто ее за тебя не сделает.

    P.S. Странно что за 30 лет С++ std так и не обзавелся типом "матрица". Бедняги разработчики до сих пор используют вложенные вектора. Или зубчатые вектора.
    Ответ написан
    Комментировать
  • Как сделать динамическую подгрузку кода?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот этот дефайн коде. Это что тут бывает?

    defineCode(stringLine);

    Если это можно свести к конечному (небольшому) числу вариантов - то можно собрать ну 5-10 библиотеки (*.dll) и подгружать ту логику которая нужна в зависимости от conditions.

    И вообще динамический код считается угрозой №1 с точки зрения антивирусов.
    Ответ написан
    Комментировать
  • Как работать с большими числами в C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В науке и технике такие форматы как double / long double / extended применяются уже давно и их
    возможности полностью закрывают все мыслимые вопросы.

    Например мы можем посчитать соотношение самой большой длины (диаметр вселенной) на
    самую мелкую длину (переменная Планка) и это будет вполне себе число которое ляжет в эти
    форматы.

    Преподаватель вас заставил считать факториал 250? Это наверное троллинг. Зачем.
    Для приближенного подсчета факториала есть например формула Стирлинга. Ее достаточно
    чтоб получить порядок числа и первые значимые разряды.

    А bigint и арифметикой можно и никогда не закончить вычисления. Это - как в криптографии.
    Длину ключа увеличили всего в 2 раза. А всех дата-центров планеты Земля уже не хватает
    чтобы в цикле прокрутить просто все значения этого длинного целого.
    Ответ написан
    Комментировать
  • С++ На всех ли платформах одинаковая точность операций с float?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну ... тут нет теоретически верного ответа. Инфо-технологии - это как физика-естествознание.
    Тут надо просто взять два компиллятора и две платформы. Собрать код типа.

    float x = 3.14;

    и посмотреть sizeof(...)

    Можно еще глянуть как выглядит число 3.14 в бинарном представлении. Сделаешь это кастингом.
    И сделать выводы о стандартах хранения флоатов в данном компилляторе.

    Теоретически должен быть 32х битный везде.

    Но проверь!

    Бывают еще double (64bit) extended (80bit),
    half float (16bit не встречал в практике никогда но литература ссылается).
    Ответ написан
    2 комментария
  • Может ли junior смотреть гайды в интернете при выполнении тестового задания?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для решения домашки можно пользоваться чем угодно. Другое дело что домашку может потребоваться защитить или объяснить как оно работает. Или сразу внести какие-то изменения.

    Некоторые собесы проходят онлайн. Тоесть тебе надо писать код в вебе и собеседующие видят скорость твоей работы. Гуглить при этом достаточно сложно. Да и это видно со стороны.

    Кстати онлайн собесы - самое лучшее что есть. Всё остальное - зря потраченное время. Домашку кроме авто-тестов никто не смотрит. И это обидно.
    Ответ написан
    Комментировать
  • Работа с рисованием в Qt. Почему не получается рисовать после оператора if?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут может быть две разные проблемы. Может чек-боксики не работают. Попробуй так. Будет рисоваться?
    painter.setPen(....);
    painter.drawRect(10,10,200,200);
    painter.drawLine(0,0,200,200);

    Или стиль рисования линии такой невидимый что ее не видно.
    Ответ написан
  • Можно ли сегодня использовать Rust вместо C++, в разработке серьёзных низкоуровневых программ?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какое состояние у языка Rust на текущий момент?


    Я несколько лет наблюдаю за долей Rust исходников в браузере Mozilla.
    По состоянию на 2022 год там была такая пропорция С/C++/Rust 0.19 : 0.39 : 0.42
    (При этом я игнорировал прочие типы файлов). И эта доля Rust кода практически
    не меняется несколько лет. Тоесть видимо те цели которые ставили Mozilla/Microsoft
    были достигнуты. Они переписали что хотели и успокоились.

    Любитель пингвинов и нелюбитель NVidia тоже обещал затащить Rust в исходники
    linux-ядра, но я не собирал сведенья по линуксу и не знаю что там сейчас. Кто
    знает? Поделитесь.

    Можно ли уже полностью отказаться от C++ в пользу Rust, в низкоуровневых вещах

    Скорее всего нет. Потому что есть потребность в безшовной интеграции с вызовами kernell и библиотек.
    В Rust скорее всего потребуется сильная адаптация кода чтобы он был пригодным для ABI например.

    Понятно, что нет полноценной IDE

    Забавное наблюдение. Я слушаю блоги хаскелистов. Душкина. Брагилевского. Вершилова.
    И практически все они хором поют одну и ту-же вещь.. дескыть им IDE не нужна а им
    достаточно vim или блокнот. Я с ними не до конца согласен. Но что-то есть в этом. Получается
    что математически совершенному языку незачем иметь обязательноую IDE. И вообще
    с каких пор мы язык должны рассматривать в комплекте с IDE? Неужели язык без
    этого инструмента неполноценен? Можем ли мы рассматривать "зрелость" языка просто
    как языка?
    Ответ написан
    83 комментария
  • Можно ли в c++ реализовать new() с c#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Насколько я помню new - это зарезервированное ключевое слово языка. Поэтому использовать
    его в роли функции вряд-ли получится.

    Да и зачем это автору? Создание новых конструкций синтаксиса - это путь в Lisp, Nemerle, Forth.
    Языку С++ это не надо. А если автору так сильно хочется - то наверное настало время сменить язык.
    Ответ написан
  • Почему код завершается с кодом 0?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ноль - это хорошо. Отсутствие ошибок. Если ты хочешь возвращать какие-то
    статусные коды из функции main - то ее надо объявить как-то так

    int main(int argc, char **argv) {
       return 555;
    }

    И тогда операционка увидит 555 и можно делать какую-то логику принятия решений. В Windows кажется переменная %errorlevel% отвечает за статусы.
    Ответ написан
    Комментировать
  • Крестики-нолики.Проблемы с ходом Х?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нет-нет дружище этот код надо выбросить. Переписывать или улучшать его нет смысла. Он плох. У тебя есть координатная сетка. Но ты почему-то не пользуешся этим а вычисляешь какие-то частные случаи.

    Вообще в изучении программирования - копирование чужого кода - это не плохо. Это вполне себе метод. Только скопировать нужно разобравшись как новый код работает. И сравнить его со своим решением. Я тоже так делал когда изучал бейсик для БД1001 или для Sinclair. Я просто копировал всякие текстовые игры-квесты и потом изменял и улучшал их.

    Найди любые крестики-нолики на С++. И в качестве критерия - код должен быть хотя-бы короче чем твой.
    Ответ написан
    Комментировать
  • Что написать на C++ для практики?

    mayton2019
    @mayton2019
    Bigdata Engineer
    У меня периодически возникает одна и таже задача - очень быстро искать нужный текст в логах. Логи большие. Могут быть по терабайту. Россыпь файлов типа

    application/log-2023-02-16-12-30.log
    application/log-2023-01.gz

    Загружать их в эластик - некогда обычно. Тут работа такая что нужно за час разобратсья и логи потом можно
    выкинуть.

    Вот есть сделать предложение - создать утилиту igrep (index-grep) которая при первом пуске - быстро проиндексирует по датам и словам.
    И при полседующих будет искать быстро. И диапазон учитывать например.

    Классический греп не подходит. Он все равно ищет линейно. Не учитывая даты. А мне надо так.

    $ igrep time=-12h level=ERROR Tomcat Network Error
    Вот. Здесь я как-бы захотел поискать все события за 12 часов назад уровня ошибки и содержащие
    два ключевых слова.

    Сами файлы обычно внутри структурированы так. Это почти всегда шаблон.
    2023-02-16T00:00:01,000 [Info] Server started.
    Есть метка времени. Уровень события. И текст события. Много-строчники (стектрейсы) можно соединять в одну строку. О длине самих файлов - ничего не известно. Могут быть от мелких (дневных) до архивов.

    Вот такая вот задача. На мой взгляд - практичная. И есть где позаниматся оптимизацией. Дисковая
    оптимизация. Индексные структуры. И размышления на тему как вообще в одном тексте искать
    другой текст.

    UPD.
    Ответ написан
    Комментировать
  • Вопрос по оформлению кода C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос по оформлению кода C++?

    Если делаешь себе пет-проекты или фрилансишь - то безразлично. Делай как читабельно лично
    для тебя. Из best-practices. Старайся уменьшать количество вложенных for/if/else. Для
    уменьшения - делай декомпозицию на функции. И добавляй guard-expressions с выходом
    в return сразу когда какое-то условие выполняется. Часто это уменьшает число вложенной логики.
    break - как аналог guard только для циклов.

    Если ты зашел в корпорацию - то первое что ты увидишь - это тонны легаси кода и корпоративные
    требования (локализованные под проект) о том как надо писать. Конвенции. Соглашения.
    И просто договорняки в команде. Например у нас было такое что в проекте мы после пары
    багов решили писать switch/case с комменарием в секции default ВСЕГДА в том случае
    когда default не содержал логики. Тоесть программист как-бы подтверждал что все
    кейсы учтены и мы ничего не потеряли в проверках.
    switch(weekday) {
      case SAT: 
         onSaturday();
      default:
         // Nothing to do!
    }

    Фигурные скобочки и пробелы обычно подсвечивают корпоративные плагины в IDE с настройками.
    Еще вариант что стиль чекается во время процедур CD/CI и выдает ошибки или предупреждения
    о нарушении стиля. Тоесть сильно упарываться сейчас этим вопросом не стоит. Когда тебя
    прижмет - привычка писать правильно появится очень быстро. За считанные недели.

    Следующий пример цикла - просто неудачен.
    for (int a = 0; a < 10; a++) {
        if (a == 5) {
            break;
        }
        std::cout << "Не то значение" << std::endl;
    }

    Здесь можно доказать что он на самом деле сводится к циклу от 0 до 4. И вообще без проверки внутри.

    Видишь очень важно правильно подбирать учебные примеры.
    Ответ написан
    1 комментарий
  • Как убрать ненужную функцию?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С такими костылями тебе проще свою функцию min написать.

    С макропроцессором - у тебя просто растет цикломатическая сложность самого процесса компилляции. Вот у тебя щас 2 кейса. Есть мин или нет. А потом будет больше кейсов. И потом другой программист, читающий твой код захочет тебя убить :)
    Ответ написан
    4 комментария
  • Как преобразовывать тип данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ремарка по поводу этого кода.
    void division(){
            int divi = static_cast <float> (a) / b;
            if(b != 0){
                cout << divi;
            }
        }

    В расчетах с floating point результат деления 0.0/0 вполне себе определен. Это неопределенность (NaN) и она вполне себе легальна в домене вещественных чисел. Или бесконечность разных знаков (Inf) если только знаменатель равен нулю. По неясным причинам автор отвергает этот результат.
    Более того в ответе будет напечатано

    cout<<"Деление:";

    и тишина. Неясно отработал метод или нет. Это дефект приложения.

    Как бороть такую проблему. В целых числах - никак. Нет легального способа. Я обычно делаю Optional
    std::optional<int> safe_div(int x, int y) {
       .....
    }

    Опционал - это коробочка в которой либо лежит число либо не лежит. Вызывающая сторона соотв
    обязана исполнить протокол вскрытия этой коробочки. Проверить что она непустая.

    Или можно попробовать монаду Either где можно указать причину ошибки.
    Не знаю есть ли это в С++ но должно быть. Во всех нормальных языках должно быть.

    Float/Double - это коварные типы данных. Они доставляют немало хлопот для bigdata. И с ними надо быть
    аккуратными. Главное правило - кастинг из floating point в целые числа в общем случае не работает. Нужно
    думать над отработой исключений всегда. Тоже самое касается диапазонов. Они коварны. И можно терять
    занчимые разраяды на конверсиях. Ответственность за эти действия ВСЕГДА лежит на программисте.
    Ответ написан
    Комментировать
  • Где ошибка в коде переворота двумерного массива?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну и хомутов ты тут повесил. Проверь что она переворачивается два раза.
    Ответ написан
    3 комментария
  • Что добавить в код, чтобы текстовая строка прорисовывалась в окне с дополнительным эффектами(Указано ниже с какими, Win 32 C++)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тяжелую задачку ты зацепил. Я не знаю есть ли в классическом Win32GDI такие функции чтоб вдоль curve печатать текст.

    Но вот есть пример с печатью под произвольным углом. Попробуй ее приспособить.

    https://learn.microsoft.com/en-us/windows/win32/gd...
    Ответ написан
  • Как сократить код с подпрограмой?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Исходник стартовал с включения заголовка
    #include <iostream>
    Тоесть поднят флаг С++. А дальше идет типичный С-код. Зачем так?
    По идее надо затаскивать vector и лямбды для суммирования.
    Это было бы идеологически правильно.
    Ответ написан
    Комментировать