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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если компиллятор глотает оба варианта и тесты проходят - то я-бы взял просто первый вариант.

    Там меньше букв.
    Ответ написан
    3 комментария
  • Какой open source проект написан на труъ Си++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Полностью согласен с необоснованностью претензий. Те кто делали код-ревью и отметили что код слишком сишный должны писать конкретные code-review points и аргументировать почему здесь надо затащить классы и ООП. Есть масса продуктов (git) написанных на С и ни у кого не возникает вопросов из серии почему мало ООП. Сколько надо ООП на квадратный метр? Килограмм?

    Нет смысла также кидаться в гитхаб и искать там правильные TrueЪ примеры. Там тоже не боги горшки обжигают. Кроме того С++ - это не только ООП, это мультипарадигменный язык. Тоесть там будут где надо виртуальные вызовы а где надо лямбды или процессор шаблонов и только богу известно почему автор решил здесь так или эдак.
    Ответ написан
  • Как замерить производительность i/o?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Замер i/o это хитрая штука. Тут недостаточно просто программирования. Нужно знать что ОС обычно берет на себя часть функций по управлению (планировщики) вводом-выводом и кеширование.

    Тоесть если ты будешь тестить свои программы в порядке 1->2 то вторая будет иметь фору в виде прогретого дискового кеша. И нужно делать хотябы -4-6 экспериментов чередуя 1->2->1->2 несколько раз и собирать кумулятивное время для каждого приложения и потом брать арифметическое среднее.

    Данный класс Timer в таком виде не нужен. Он слишком прост и его можно заменить в коносли на вызов

    $ time yourapplication

    В качестве улучшений таймера я-бы сделал StopWatch. Это таймер который можно вызывать несколько раз и он будет кумулятивно считать время между begin-end и выводить его в конце. Так можно мерять интересующие фрагменты кода которые работают только с диском и игнорировать например вычисления с CPU.
    Ответ написан
    Комментировать
  • Как сгенеририовать СЛАУ (система линейных алгебраических уравнений) больших размеров?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для хранения матрицы 10000 на 10000 в формате double вам понадобиться кусок памяти порядка 800 Мб.
    И это только для хранения исходных данных. А если нужно будет искать всякие определители и обратные матрицы
    то сложно себе представить сколько дополнительной памяти будет нужно.

    Если курсовая затрагивает разреженные матрицы (это где много дырок или областей без данных) - то можно
    посмотреть в сторону сжатых матриц. Не знаю как щас а в 90-е была куча библиотек для этого дела.

    Чем заполнить матрицы в данном примере - ХЗ. Надо погружаться в сам курсовой. Если он растет из физики то и исходные данные надо брать оттуда. Там всякие диагональные и треугольные и прочие.
    Ответ написан
    Комментировать
  • Как узнать у long long числа количество цифр?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Haskell-style.
    int numLen(long long num) {
      return numLen(num, 1, 10);
    }
    
    int numLen(long long num,int cnt,long long threashold) {
      return 0 + num < threashold ? cnt : numLen(num, cnt + 1, threashold * 10);
    }
    Ответ написан
    Комментировать
  • Как написать алгоритм пересечения графиков двух функций с определенным уровнем допуска?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если функция непрерывна и если задана таблично. То можно проинтерполировать значения на интервалах между точками хотя бы по любой гладкой кривой типа полинома. И тогда окажется что несмотря на то что дискретные точки недостаточно близко находились друг к другу, а интерполированные отрезки сблизились к некому "эпсилон".

    Тоесть в условии задачи скорее всего не хватает деталей.
    Ответ написан
  • Как найти точки внутри фигуры, за пределами фигуры и на фигуре?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Все подобные задачи решаются через расчет ориентации точки на плоскости относительно вектора (в данном случае это сторона ромба). Знак векторного произведения даёт нам ориентации. И дальше - дело техники. Проверить все стороны и доказать что точка - по одну сторону ( знак плюс или минус - зависит от базиса и системы координат ). Его проще вычислить экспериментально за 2 проверки.
    Ответ написан
    Комментировать
  • Как шифровать заголовки/атрибуты файлов С++ в MFT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Шифрование заголовков и MFT это слабая защита или даже вообще не защита. Софт который восстанавливает поверхность диска - умеет распознавать и реконструировать блоки файлов как паззл если файлы имеют известный формат и статистические свойства
    Ответ написан
    Комментировать
  • Как организовать передачу данных с сетевого интерфейса приложению на C++ максимально быстро?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос поставлен неправильно.
    Чтоб оптимизировать odbc - надо 100% знать что именно он является узким местом. Я бы начал с анализа исполнения и извлечения данных локально на сервере. ДБА здесь поможет. И если ваша задаче связана с ETL - почитайте про техники. Может экспорт в csv файл с загрузкой в с++ приложение будет быстрее. Может репликация бд или миграция.
    Ответ написан
    Комментировать
  • Скорость чистого перебора - как такое может быть?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Принты. Или наблюдения.
    1. Цикл где идет merge двух векторов - тривиален. Слабым местом может быть функция резерва памяти, которая по разному реализована в win/Linux. Я не утверждаю что в linux она плохая. Возможно просто звёзды сошлись так что page или другие свойства ос по отношению к аллокаций стали неблагоприятны.

    2. Что там с разрядностью 32/64? Надо проверить. Что с железом? Не пытается ли автор нас обхитрить, запуская все это на разном железе. Даже ничтожные различия в размере кешей L1 могли тут сработать.

    3. Версии STL. Автор использует не сырые указатели а итераторы. Причем хитрые. Какая там логика на инкремент и на разыменование под капотом.

    Чтоб отбросить мои предположения полностью - предлагаю этот цикл (предположительно самый горячий код со слов автора) переписать на указатели без STL.

    4. Опции GCC надо посмотреть. Оптимизацию подвигать. O1, O2.
    Ответ написан
    1 комментарий
  • Проблемы в реализации синтаксического анализатора?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да тут не вопрос, а целое задание для фриланса. Не знаю чем автор занят, репостом ли чужих задач или решением своих но тут надо просто готовить котлету денег.

    Или сильно сильно упростить вопрос чтобы он хотябы был осязаем для вопросника.
    Ответ написан
    Комментировать
  • Не получается расшифровать изображение?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В программе имеется работа с сетевыми сокетами. Можно ли отделить чистый код шифрования от сетевых задач? Убежден что это поможет отвечающим сконцентрироваться на решении главного и отбросить вероятность того что автор ещё где то наделал других ошибок по стеку.

    Разделение кода на слои также является нужным скилом для c++ ника.
    Ответ написан
    2 комментария
  • Как можно в c/c++ изменять значения ОЗУ?

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

    Для своей памяти - это работа с указателем. Выделяешь себе кусочек памяти через mallox/new и меняешь что надо.
    Ответ написан
  • TCP - как создать свой пакет?

    mayton2019
    @mayton2019
    Bigdata Engineer
    C TCP обычно не работают пакетами. Работают потоками или Streams. Это нормальный левел прикладного программиста. И я почти не знаю задач кроме студенческих лаб где кому-то вдруг понадобился пакет как таковой.

    Примеров полно. API: socket(), connect(), bind() ,listen().

    Поэтому может быть автору нужен принципиально другой протокол. Прикладной UDP. Или более системный IP но с последним сложнее работать т.к. операционки запрещают его напрямую. Через него легко устраивать различные Syn-Flood атаки. Нужно как-то повышать привилегии или пользовать сторонние либы.
    Ответ написан
    2 комментария
  • Как правильно параллельно обрабатывать файлы на c++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Это видимо учебная задача. Практического смысла параллелизма здесь мало.

    Обычная дисковая подсистема на домашнем ноутбуке состоит из 1 HDD/SDD. И он не параллелится. Тоесть это такое жлобское устройство которое в 1 момент времени может обслуживать чтение и запись 1 блока файловой системы (или сектора или кластера неважно). Поэтому параллелизм толком ничего не дает. Однако если у вас какие-то RAID массивы или сеть хранения данных то она может обеспечить такие действия.

    Что еще в задаче плохо.
    while(!InputFile.eof())
        {
          getline(InputFile, tmpString);
        }

    Непонятно что здесь происходит? Перемотка в конец файла? Почему так дорого? Почему мы должны каждый раз получать строки? Ведь нам нужна только последняя? Может надо было взять первую? Вобщем непонятно.

    Вот если-бы автор решал задачи наподобие map-reduce где работают с большими файлами тогда параллелизм был бы понятен. Там чтение блока файла чередуется в вычислениями.

    Здесь вычисления - мелкие. И большая часть процессорного времени зря сгорит в старт-стопах потоков и в финальном join потоков (которые я кстати не вижу).
    Ответ написан
    Комментировать
  • TCP - как лучше передавать данные?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Лучше всего простой текстовый протокол.

    json при данной постановке - вторичен. Когда будет написана основная игровая логика то перейти на json будет не сложно.
    Ответ написан
    Комментировать
  • FFmpeg. Как программно записать поток в реальном режиме?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку номер кадра для real-time не имеет смысла то надо поискать такую нумерация которая этот смысл принесет.

    Пиши текущий timestamp в качестве имени.
    Ответ написан
  • Как сделать реакцию на вызов метода у объекта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Эта тема не про иерархию и ООП.

    А про алгоритмы и структуры данных. На их языке вопрос должен звучать так.

    - Дано дерево объектов {Car}/{Box}/{Bomb}
    - И при возникновении события в листовом уровне дерева - должна удаляться вся цепочка Parents вплоть до уровня Car.
    Ответ написан
    Комментировать
  • Как передать два параметра в тред?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку С++ - это объектный язык то обсуждение того как что-то передать надо вести в терминах объектов.
    Этож не ассеблер. Смотрите на шапку функции по созданию треда.
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES   lpThreadAttributes,
      SIZE_T                  dwStackSize,
      LPTHREAD_START_ROUTINE  lpStartAddress,
      __drv_aliasesMem LPVOID lpParameter,
      DWORD                   dwCreationFlags,
      LPDWORD                 lpThreadId
    );


    В ней lpParameter должен быть указателем на структуру из вашего массива и длины. Или просто вектор целых чисел в терминологии STD (std::vector)
    Ответ написан
    Комментировать