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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Дизассемблирование и реверс бинарных файлов - это очень сложная задача.
    Она стоит денег и обычно под это дело нанимают людей с опытом.

    Были такие инструменты как SoftIce, IDA Pro. Они помогали профессионалам в дизассемблере
    бинарей. Можешь попробовать но сразу скажу что это не задача на 5 минут. И в этой области
    практически нет кухонных советов. Очень многие вещи не документированы и их надо
    понимать в суперпозиции с опытом например использования Ассемблера и знания архитектуры CPU.
    Короче это очень долгая и самостоятельная активность. И реально очень мало людей смогут
    тебе помогать в процессе.

    Хотя возможно твоя задача решается проще. Если сам создатель Paint Tool Sai заложил туда
    такую возможность - то следует ей сначала воспользоваться. Это будет быстрее и без
    лишнего оверхеда.
    Ответ написан
    Комментировать
  • Почему эта программа вычисляет факториал больших чисел неправильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По поводу факториала 1000 и более толстых факториалов.
    Есть формула Стирлинга. Она позволяет приблизительно прикинуть
    число в вещественной форме.

    Тебе это надо чтобы ответить на вопрос, а вообще принципиально возможно ли посчитать это
    число и положить его в память.
    Например для 1000 последние члены этого ряда в умножении будут
    добавлять по 3 десятичных разряда.

    .......998 * 998 * 999 =

    Должно быть порядка 2500 знаков.

    По поводу AVX и прочее. Один регистр AVX будет брать 512 бит. В перерасчете на десятичную
    систему - можно делить грубо на 3 и это будет 170 десятичных цифр. Тоесть надо много
    таких регистров.

    По поводу этого кода.

    unsigned long long result = factorial[j] * i + carry;
                factorial[j] = result % BASE;
                carry = result / BASE;


    Я не понимаю что здесь происходит. Зачем ты переводишь в систему счисления с основнием 1000000000

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


    Я просто не программист, это у меня задание такое.
    Сторонние библиотеки по условиям нельзя.

    Про SIMD слышу впервые.

    Это вообще приводит в изумление. По хорошему, мультипоточка и параллелизм это очень
    сложная тема. Очень синьорная и в ней много всяких квантовых эффектов. И чтобы ей
    просто заниматься нужно иметь хотябы 1-2 года опыта. Сомнительно чтобы новичек
    вообще что то написал (и отладил под нагрузкой) работающее. Или разве что тебе
    ChatGPT что-то там написал и ты просто случайно где-то проскочил. Повезло наверное.
    Ответ написан
    Комментировать
  • Как исправить баги в коде?

    mayton2019
    @mayton2019
    Bigdata Engineer
    И есть ли тут ещё какие-либо баги которые я сразу не заметил?

    Это очень интересный вопрос. На мильон я-бы сказал.

    Вообще если на программу не написана спецификация или тесты то тогда совершенно
    невозможно точно утверждать является ли поведение багом или так задумал автор.
    Я вот к стыду не помню всех правил морского боя. Что там с кораблем. Когда он затонет?
    Как мы узнаем что поражены все части корабля?

    Глядя на код трудно сказать где там ошибка. Надо его запускать. А запуск связан с вводом
    выводом. Тоесть нужно потратить много человеко-часов вводя буквы и цифры и симулируя
    разные игровые кейсы. Сам понимаешь нет такого энтузиаста который бы осилил за ништяк
    тестировать.

    Поэтому по возможности напиши тестовый код (в соотношении хотя-бы 1:10) чтобы он тестировал
    автоматически основной код. Есть такая практика. Модульное тестирование.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    В лихие 90-е был такой антивирус типа ADinf кажется. Он работал под MS-DOS и он после
    проверки каждого файла писал в свою базу контрольную сумму как результат проверки.
    Есть позитивный результат и связь 1:1 контрольной суммы? Все хорошо! Кажется такие антивирусы называли
    ревизорами. И если файл по каким-то причинам менялся то Adinf соотвественно бил тревогу
    и сообщал что длина или сумма отличается от оригинальной.

    Сегодня все программные продукты разрабатываются в версионным контролем. Тоесть есть Github
    или BitBucket где лежит оригинальный код. И есть репозитарии бинарей. Их много. Для Linux
    apt/rpm, есть у Java maven и есть у Python свой PIP

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

    Я слушал интервью с Евгением Касперским. Он сказал что не сильно верит в антивирусы но
    очень доверяет системам с ЭЦП и тотальному алгоритму проверки доверия. Тоесть допустим
    ты доверяешь производителю ПО - соотв. ты должен чекать наличие сертификата у любого
    бинарника перед запуском. Обычно чек сертификата это легче чем антивирус-контроль
    и при хорошей инфраструктуре может быть очень быстрый.

    В лихие 2000е я читал о разработках Филиппа Циммермана который создал свою систему
    кругового доверия и назвал ее PGP. Сегодня она может называться по другому но суть в том
    что нет главного арбитра а есть просто круг друзей которыеы могут что-то там подписывать
    и соотвественно если вы доверяете друзьям то вы доверяете всему на что их подпись накладывается.
    Система очень интересная. И заслуживает внимания.
    Ответ написан
  • Как сравнить char в с++ на пустоту?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тебе надо читать документацию по этой библиотеке (com ?):

    char c = com.ReadChar(successFlag); // read a char

    и узнать что конкретно она возвращает в виде пустоты.

    Она может возвращать знаковое отрицательное число (int) -1 в качестве признака например.

    А для char - никакой пустоты не бывает. Обычно char - это 8 или 16 бит беззнаковое целое число (завист
    от компиллятора).
    Ответ написан
    Комментировать
  • Как разумно поставить себе начало в программировании (C++ и C#)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Капец много текста написал.

    Если кратко - то найди себе ментора. Это позволит тебе не выгорать а двигаться
    вперед.

    Должен был написан план с датами что изучать. С++ - очень сложный язык
    и в нем ного фичей. Даже его создатель рекомендует не брать все сразу
    фичи а изучать какое-то разумное подмножество.

    Должен быть учебный проект с внятным техническим заданием.

    Код должен содержать тесты и иметь какие-то критерии качества и эстетики кода.

    Параллельно с С++ тебе придется изучать железо и операционные системы. Без этого никак.
    Это язык - общесистемного программирования и делать чисто прикладные вещи на нем
    нет смысла. Ты должен быть погружен в систему.
    Ответ написан
    Комментировать
  • Можно ли демонстрировать или отображать программу .exe в окне своей же программы?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Да можно. Если речь идет например о том чтобы в HexEdit открыть сам HexEdit.
    Но некоторые ОС в момент исполнения файла могут накладывать на него блокировку
    поэтому редактировать его будет нельзя или перемещать тоже будет нельзя.
    Ответ написан
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С точки зрения С++ есть команды new/delete которые управляют временем жизни долгоживущих
    объектов. Таких как массивы примитивов и более сложные объекты из парадигмы ООП,

    А для временных переменных внутри функции выгодно использовать стек. Их аллокация синхронна
    с входом в функцию и деаллокация - return. Кроме того стек дает возможность вызвать функцию
    из самой себя
    , таким образом создавая еще один сет таких-же п еременных (это нужно для рекурсии
    тоесть для погружения в глубины деревьев и графов и прочих комбинаторных задач).

    Если-бы мы эти временные переменные размещали в куче - то у нас возникла бы задача очень строгого
    контроля над деаллокацией. Нужно было-б гарантировать что delete сработает за мгновение до return,
    а это не всегда удобно в рамках С++ кода. И это может быть причиной сложных и трудноуловимых
    ситуаций с memory leak. Это когда программа в состоянии покая как будто бы начинает подъедать память
    кучи безо всяких видимых оснований. Это - проблема и с этим борются.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если ты - программист на С++ то можешь сделать свою собственную библиотеку с таким-же интерфейсом
    и со своей реализацией. Чтоб работала как прокси. Вызывала нужные функции из оригинальной библиотеки
    а для функции a2 - возвращала true.
    Ответ написан
  • Как "склеить" два файла?

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

    section .data
        error_message db "Hello byte, hello word", 0, 0,0,0,0,0,0,0,0,0,0,0,0


    Потом в hex редакторе просто передвигаешь слово вправо не забывая что ASCIIZ строка обязательно
    должна закончистя нулем.
    Ответ написан
  • Почему игра уходит в бесконечный цикл и как это исправить?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Похоже у тебя внутри цикла ctrl не изменяется. Поэтому условие выхода тоже не меняется.
    Ответ написан
  • Как оптимизировать код с++ с рекурсией в времени?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Здесь медленным является скорее всего вычисление функции S.

    int S(int p, int q) {
        if (p == q) {
            return F(p);
        } else {
            return F(p) + S(p + 1, q);
        }
    }


    Вот для входных параметров p = 0 и q = 0xFFFF_FFFF например нам придется
    вращать пустой цикл 4 миллиарда раз (или 4 млр раз проваливаться в рекурсию)
    и все просто для того чтобы посчитать сумму

    F(p) + F(q)

    Можно убрать эти холостые вычисления и таким образом ускорить прохождение тестов.
    Ответ написан
  • Фреймворки для кросс-платформенной разработки. Практикуют ли переписывание под разные платформы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сам UI не делал. Но слышал мнение от опытных UI-щиков что кросс-платформенная разработка
    на практике проваливается. В мелочах. Где-то какие-то фичи кросс-платформ не может одинаково воспроизвести.

    Обычно конторы побогаче для разработки своего мобильного приложения под Android / iOS нанимают 2
    команды и каждая делает UI на нативных фреймворках. Конторы победнее - страдают от нехватки фич.
    Ответ написан
    Комментировать
  • Что можно разработать на C++ кроме нативных GUI-приложений и серверной части веб-приложений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По поводу разработки ОС. Кажется BeOS и HaikuOS были созданы с использованием языка С++.

    Все остальные не используют С++ для разработки СОБСТВЕННО ядра. При этом С++ может
    быть использован для разработки графической части (KDE например). Но твой вопрос скорее
    всего не в этом.
    Ответ написан
    2 комментария
  • Как получить случайные числа в C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Получение по настоящему случайных чисел - это криптографическая задача и ее делают через всякие
    библиотеки типа OpenSSL
    и прочие. Там есть API для криптостойких ГПСЧ. Вы можете вызывать их
    без сидирования между вызовами поскольку там эта проблема уже решена.

    Если вы уже добрались до работы с системными часами
    system_clock::now()
    то означает что у вас есть какие-то мысли по поводу ГПСЧ или вы видите недостатки просто
    вызова rand() - то расскажите какие именно. Или где вы внутри rand увидели дефект.
    Обычно 99% пользователей довольны rand и име ничего другого не надо.

    В вашем коде srand(..) нужно вызвать 1 единственный раз и потом просто брать значения из rand(..)
    Ответ написан
    Комментировать
  • Что стоит учить с или c++ или c#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Добрый вечер! Столкнулся с такой проблемой: Мне очень нравятся семейство языков Си, у меня есть выбор учить C++ либо C#, хочу разрабатывать ПО для ПК. Подумал начать с C++ и говорят что сначала поучить чистый СИ, а после переходить на C++, так что же из этого правильно? Надо ли учить Си? Или может лучше начать с C#, а дальше уже выучу C++?

    Тема сравнения С/C++/C# в публичном пространстве - опасная тема. Она обычно заканчивается
    топиком в 1000 страниц и великой войной всех против всех. Я видел много таких войн.
    Они ничем не заканчиваются. Специалисты остаются при своих мнениях. А зритель просто развлекается.

    Сам по себе выбор языка ставят только новички. Професиионалу безразличен язык (почти). Его может больше интересует отрасль, стек технологий, стандарты и протоколы. С моей точки зрения сегодня
    таким стандартом может быть выбор облака (AWS, Azure, GCP).

    Чистый СИ учить смысла нет. Учи сразу С++. Но даже его создатель Бьорн Страуструп считает что С++ это
    сложный язык и он настаивает чтобы новички не брались учить все фичи сразу. Исключение по языку
    СИ может быть в том случае, если ты собрался быть инженером по разработке микро-контроллеров
    и у тебя скорее всего будет только СИ как основной (на 80-90%) инструмент взаимодействия с таким железом. Выйти на мидловый или синьорный уровень в С++ очень тяжело. Тяжелее чем в других языках.
    Поэтому будь готов терпеть. Вот когда виски станут седые - тогда и будешь господин-синьор.

    C# - это очень сильно корпоративный стандарт от Microsoft. Никакой связи с С++ он не имеет. Он конечно
    внешне похож но это сходство обманчиво. Да изучать его тоже можно. Он учится легко. Существуют книги
    вроде ".... C# за 14 дней". Разработка бизнес-приложений на шарпах идет гораздо быстрее чем на С++
    например. И завалить систему в синий экран в этом языке гораздо труднее. В нем реализованы методы
    защиты памяти и нельзя грязно трюкачить с указателями как это любят в С или С++. Производительность
    шарпов в численных методах будет слабее чем в С++ но обычно бизнес не ставит таких задач и чаще
    надо будет писать веб-хендлеры или хендлеры MQ-систем. Кач уровней синьорити идет быстрее в шарпах.
    Ответ написан
    2 комментария
  • В чем проблема в коде работы с графом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Зачем делать безсмысленный makeStep? Пускай он возвращает булево значение.

    boolean makeStep(Graph &graph, ValuesTable &table) { .... }


    Не было отрицательных свойств среди вершин - значит пускай вернет true.
    Тогда будет стоп алгоритма. И не надо будет
    делать дополнительных пере-расчетов.
    Ответ написан
    7 комментариев
  • Как найти точки пересечения двух многоугольников?

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

    ( x1 >= x > x2, y1 >= y > y2 )

    Это дает возможновть в любых координатах в int, double e.t.c. считать плотно рядышком стоящие
    прямоугольники не пересекающимися вообще.
    Ответ написан
    Комментировать
  • Как написать данный код на с++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если этот код компилируется С++ компиллятором - то тогда нет причин для беспокойства.
    А если твой препод такой нудный - то спроси до какой степени он хочет переписывать?
    Самое простое что приходит на ум - заменть ASCIIZ строки на std::string. Попробуй везде
    сделай такое. Вот это

    void output_res(char* mas_str, int* arr, char character, int occurrences)


    заменить на

    void output_res(string mas_str, int* arr, char character, int occurrences)


    Потом strtok, strlen, printf заменить на методы string или cout.operator<< соотвественно.

    Это будет просто первая итерация рефакторинга, которая двигает этот ужас по направлению
    к красоте и феньшую. Если твой душный ментор все еще будет недоволен - то приходи назад
    будем внедрять лямбды и прочее аж до 20х плюсов.
    Ответ написан
    Комментировать
  • Через какой алгоритм решать эту задачу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоя на 12 этаже можно за 1 ход попасть на 23 этах (Вверх) или на 6 этаж (Вниз).
    Стоя на 6 этаже можно за 1 ход попасть на 11 этаж (ВВ) или на 3 этах.
    (и так далее)

    Вот такой граф получается. Немного напоминает Гипотезу Коллатца. За счет минус единички
    адрес меняется четность и есть надежда что мы не зациклимся а все таки куда-то двигаемся.
    Значит можно упорным баловством с кнопками куда-то приехать.

    Вобщем нужен орграф с 70 вершинами и опционально с 2 ребрами для каждой вершины.
    Недостижимые вершины - это этажи куда нельзя будет попасть соотвественно.
    Ответ написан
    4 комментария