Задать вопрос
Ответы пользователя по тегу C++
  • (Вопрос без однозначного ответа) Почему в window socket 2 используется так много различных дефайнов и псевдонимов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я тоже до конца не понимаю цели и задачи которые ставились для winsock2 но вот можно
    почитать аннотацию здесь https://learn.microsoft.com/en-us/windows/win32/wi...

    С моей точки зрения было время большого разлада между лагерем Microsoft и Unix. И вместо того
    чтобы просто позаимстовать сетевые библиотеки или купить лицензии, MS как всегда стал делать
    что-то свое, "сумчатое" и ни на что не похожее. Яркий пример Component-Object Model (COM).
    Нигде такого нет.

    Для чего создаватьtypedef struct addrinfo{}? Только ради того, чтобы не писать struct в Си?

    Да все верно. Именно для такого юзкейса typedef и создавался. Плюс еще можно примитивы определять.

    Для чего определять *PADDRINFOA

    Вот здесь не знаю для чего. Хотя подобный подход я видел не только у Microsoft но и у других.
    Вообще иногда мы не догадываемся но код может быть сгенерирован кросс-компилляторами
    и в этом случае названия идентификаторов могут быть очень длинными и причудливыми.
    А удаление звездочки из синтаксиса сужает возможности разработчика тоесть не дает
    допустить ошибку. Такая себе строгая типизация в квадарате.

    Где-то спокойно используется int, а где-то используетсяtypedef unsigned __int64 UINT_PTR, опять же вместо того, чтобы просто писать unsigned __int64.

    Это очень старый технический долг языка С++ и его уже нельзя исправить. Дело в том
    что спецификация языка не объясняет какой разрядности должен быть int. Он может быть
    16, 32 бит в зависимости от целевого железа. По сути он - синоним регистра процессора.
    И когда мы делаем цикл от 1 до 10 и нам по сути неважна разрядность параметра цикла - мы просто заказываем
    int чтоб долго не думать. И компиллятор собирает очень быстрый и оптимальный код.
    sizeof(int), или константы в в limits.h могут дать подсказку по вашей текущей архитектуре.

    typedef unsigned __int64 UINT_PTR

    Здесь идет форсирование разрядности в 64 бита. Такие потребности возникают
    в момент когда у нас есть например жестко заданный формат (сетевой протокол
    или дисковый формат файла) и мы должны гарантировать что другие архитектуры
    микрокотноллеры, мобилы и прочее правильно смогут интерпретировать эту структуру.
    Тут еще и порядок байтов внутри слова тоже важен. В наше время даже есть сет
    стандартов на описание таких структур ASN, AVRO, Protobuf, Thrift.
    Ответ написан
    1 комментарий
  • Калькулятор C++ как убрать 1.33333e+06 подобные результаты вычисления?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Предположительно ты работаешь с типами данных float или double.
    Эти типы не имеют однозначного отображения в десятичную
    систему. Такова их природа.
    Ответ написан
    Комментировать
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В данном исходнике нет проблемы атомиков. Но здесь есть проблема отсутсвия синхронизации потоков а и b.
    Нужно наладить синхронизацию и дальше атомики станут приносить ощутимую пользу.
    Ответ написан
    Комментировать
  • Как исправить код?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Эта программа считает определители 3 порядка. Теряется красота С++ и обобщение.

    Математически можно считать определители 4 порядка через миноры матрицы понижая размерности до тех
    пор пока мы не дойдем до 3 порядка рекурсивно. И тогда сработает формула с хардкодом

    a[1][1] * a[2][2] * a[3][3] + a[1][2] * a[2][3] * a[3][1] + a[2][1] * a[3][2] * a[1][3] - a[1][1] * a[2][3] * a[3][2] - a[1][3] * a[2][2] * a[3][1] - a[3][3] * a[1][2] * a[2][1];


    Так можно посчитать 5 и 6 порядок и выше.

    Очень жаль что автор не фокусируется на сути, называя "код" просто "кодом". А ведь это метод расчета чего-то конкретного.

    Представтье что музыкант любое произведение называл бы просто "нотами". Странно правда?
    Ответ написан
    Комментировать
  • Как начать программирование в среде Apache NetBeans?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для С++ разработки вам нужен компиллятор. Это может быть clang, gcc или Microsoft C++.

    NetBeans создавался для Java разработчиков. Хотя он возможно и поддерживает С++ синтаксис но
    мне разработка на сях в нетбинсе кажется странной.

    Посмотрите в сторону Visual Studio Code. Ее все хвалят.

    Полного руководства скорее всего нет нигде и не будет. У сред - тысячи фич и описывать их бесполезно.
    Тем более что идет активная эволюция сред и плагины обновляются чуть ли не каждый день.
    Поищите в youtube уроки. Этого должно хватить для начала. А те ошибки которые вы видели - относятся
    больше к наличию компилляторов а не к самой среде.

    Кстати освойте компилляцию в консоли. Это очень важный навык для любого разработчика. И после этого
    ваши страхи перед средой станут чуть меньше.
    Ответ написан
    2 комментария
  • Сделать трассировку кода по примеру на картинке с++?

    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 комментария