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

    @rPman
    нет
    кардинально неверное использование деструктора

    Деструктор вызывается когда вы уже вызвали удаление объекта delete msp, и призван удалить все что объект проинициализировал но не его самого.

    Отличный пример, использование класса для автоматического закрытия файла

    class FR
    {
      FILE *f;
      public:
      FR(char* name)
      {
        this->f=fopen(name,'r');
      }
      void do()
      {
        // тут работаем с файлом
        // если произойдет проблема, вызываем эксепшн
        throw "The problem";
      }
      ~FR()
      {
        fclose(this->f);
      }
    }
    
    void main()
    {
      try
      {
        FR fr('test.txt');
        fr.do();
        printf("all ok");
      } catch(const char* msg)
      {
        printf("Error: %s\n",msg);
      }
    }

    тут голова не болит когда закрывать файл, так как деструктор будет вызван автоматически при окончании жизни объекта
    Ответ написан
    2 комментария
  • Как обратиться к ячейке памяти?

    @rPman
    *((unsigned __int8*)0xb000)
    Ответ написан
    Комментировать
  • Увеличение размера массива объектов?

    @rPman
    массивы инициализируются по другому
    Class_ListPerson[size]={Class_ListPerson(...),Class_ListPerson(...),..};
    если есть конструктор без аргументов, то можно без всего что справа.

    Изменить размер массива нельзя, так как его размер не хранится нигде и является константой, т.е. придется работать не с самим массивом а ссылкой на него и заполнять вручную через выделение памяти (можно конечно работать со ссылкой на первый элемент как у вас, но это bad practics, ссылки надо избегать всеми способами).
    Ответ написан
  • Стоит ли учить программирование по старой книге?

    @rPman
    Лишней книга не будет, но из-за устаревшей парадигмы и стандартов у вас возможно (не видел книгу) возникнут проблемы с компиляцией примеров.

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

    @rPman
    потому что
    cout << NumNewline(digit);
    а в самой функции стоит
    return 0;
    Ответ написан
    Комментировать
  • Как скомилировать с++ программу под Линукс?

    @rPman
    чтобы запустить приложение из GUI необходимо создать ярлык в этом GUI, в зависимости от вашего окружения (gnome/kde/xfce и т.п.) инструкции будут разными но похожими. В общем случае если ваше приложение консольное, то запускать его нужно с помощью терминала, их тоже много на выбор от самого древнего и примитивного xterm до штаных для каждого DE, например для kde это kconsole.

    вот примеры команд для разных терминалов чтобы окно после завершению работы программы не закрывалось:
    https://switch-case.ru/71821000
    Ответ написан
    Комментировать
  • Как из программы получить доступ к UI полям другой программы?

    @rPman
    Правильный способ (не советую) - сложный, нужно выявить точную версию компонент, собрать соответствующее приложение с их использованием (только так можно будет использовать объекты и вызывать методы правильно) и инжектить его код в процесс. Тогда вы получите доступ ко всем элементам и сможете делать что то типа getText()

    Неправильный (рекомендую) - простой, симулируете действия пользователя, отправляя окну события клавитуры и мышки (или напрямую через средства ОС, например в windows это отправка сообщений WM_... в win api есть соответствующие методы), к сожалению в QT компоненты не являются win api объектами, даже label таковым не является и у вас будет просто одно окно с битмапом, а это значит для чтения содержимого окна можно использовать только экран (и распознование текста по изображению) и в некоторых случаях clipboard, например необходимое поле это EditBox, симулируем команду ctrl+a (выделить весь текст) ctrl+c (скопировать) и тут же читаем содержимое в своей программе

    Второе успешно использовалось в проекте где необходимо было получать данные из программ, написанных с использованием ОЧЕНЬ разных инструментов и следить за компонентами каждого чтобы пересобирать код инжекта каждый раз как оно обновится - геморно.
    Ответ написан
    Комментировать
  • Как правильно пользоваться разделителем кода для Windows и linux?

    @rPman
    Смотрите чем вы будете собирать, так как различия могут появиться в зависимости от инструмента, например собирая под cygwin/mingw/visualstudio может потребоваться менять код, и сильно.

    Дефайны могут отличаться в зависимости от использованных инструментов для сборки, а то может у вас scons и сами дефайны определяются в скриптах или makefile, как ВАМ пожелается, хотите _WIN32_ хотите WINDOWS хотите как угодно...
    Ответ написан
    Комментировать
  • Как переопределить функцию в шаблоне с++?

    @rPman
    Все свои SomeClassX породите от базового SomeClass определенным виртуальным методом show, тогда шаблон не понадобится, просто в классе Tree в методе show(SomeClass t) напишите t->show() а сам show определите в каждом SomeClassX свой.
    Ответ написан
    5 комментариев
  • Можно ли что то написать зная базовые основы С++?

    @rPman
    Можно что то написать, зная вообще одну математику и даже не используя условия, циклы и т.п., одни математические выражения, что то из серии ненормального программирования. Но мне кажется, почесывать горло через задницу будет примерно так же дико и не практично.

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

    @rPman
    Попиксельно пройдитесь по области внутри трехугольника.
    Вот как это делают для всего изображения, остается заменить в нем два вложенных цикла по всем точкам на точки трехугольника.

    Про треугольник ищите алгоритм попиксельной заливки треугольника или напишите его сами, для пиксилизации линии берите алгоритм Брезенхэма
    Ответ написан
    4 комментария
  • В чём проблема создания окна?

    @rPman
    смотрите что вернул GetLastError()
    https://docs.microsoft.com/en-us/windows/desktop/d...
    Ответ написан
    Комментировать
  • Какой выбрать C++ компилятор под Windows?

    @rPman
    Очень часто разработчики под windows с самого начала начинают работать с visual studio и с его немного несовместимым компилятором и std библиотеками, из-за чего последующие попытки собирать код из стандартного окружения порождают кучу работы, на нее забивают и продолжают сидеть на майкрософтовском.
    Самостоятельная настройка окружения для сборки под windows тут возможна (без загрузки visual studio) но поверьте, вам не захочется вручную загружать и настраивать сотни пакетов, никто этой фигней не мается. Ставят visual studio с интерфейсом, а там никто не мешает использовать командную строку.

    В общем случае, с вероятностью 99.9999999999%, вам будет НЕДОСТАТОЧНО только компилятора, вам нужны еще и библиотеки, настроенные на ваше окружение. Т.е. в зависимости от того под какую архитектуру и операционную систему вы собираете библиотеки/бинарники, и будет соответствующий ответ.

    Наиболее полно готовый и почти настроенный тулчейн (почти и наверняка это будет gnu compiler, но ничто не помешает использовать clang) можно найти в linux операционных системах, т.е настроив кросскомпиляцию из linux окружения можно будет собирать все, кроме наверное macos (ну там свои заморочки и это не невозможно).

    Только там, одинаково просто, можно будет собирать как windows приложения так и arduino скетчи.

    p.s. для настройки linux дистрибутива интернет вам понадобится только что для поиска документации, репозитории (тех же debian/ubuntu) можно приобрести на компакт дисках или сделать свой offline инсталятор.

    p.p.s. вы можете попытаться использовать windows 10 (не домашние) подсистему linux, установив в нее ту же ubuntu, и без каких либо накладных расходов (это не виртуалка, это скорее wine наоборот) работать

    Ближайший аналог удобного окружения но под windows это mingw (много рукошевелений) и cygwin, последняя так вообще копирует linux, но там свои заморочки, например файловые пути в итоговом приложении для совместимости будут вида /cygdrive/c/...., плюс совместимость dll своя, ни с чем не совместимая.
    Ответ написан
    1 комментарий
  • Как реализовать "КЛИК" в C++ DOS?

    @rPman
    По уму вам достаточно отслеживать событие поднятия кнопки мыши и именно его считайте кликом, но более верно записывать даты последнего нажатия и отжатия кнопки (для каждой кнопки пара переменных) и если разница между ними меньше определенного порога то считать что есть клик
    Ответ написан
    2 комментария
  • Как скомпилировать код внутри скомпилированного кода?

    @rPman
    Готовые инструменты советую искать в инфраструктуре LLVM, это виртуальная машина, компиляторы и главное отличная поддержка огромного количества платформ. И главное у вас есть возможность запускать эти приложения в контролируемой вами песочнице, если я верно потелепатствовал о ваших целях.

    С точки зрения использования это сложнее чем подключить какой-нибудь интерпретируемый популярный язык типа lua, но зато высокая производительность и гибкость.
    Ответ написан
    Комментировать
  • Как создать программу для захвата видео с экрана?

    @rPman
    GpGpu для программиста на текущий момент выглядит так - на неком языке (все поддерживают opencl, а nvidia в частности свою cuda, но онро идеологически похоже), очень похожем на c++, пишется код, с одним callback методом, который будет вызываться последовательно и параллельно (это решит драйвер видеокарты, вы этим не почти управляете) для элементов вашего массива, который по факту - текстура в памяти (на низком уровне вы тут не заморачиваетесь) и сохраняет результат в другой.

    Передача данных между обычным обычной оперативной памятью и видеокартой, объективно самая дорогая операция, и обычно стараются свести такие копирования к минимуму (т.е. на старте и под конец, для получения результата). Причем на столько, что к примеру получение содержимого экрана в оперативную память и копирование ее обратно в формате, понятному вашему cuda приложению будет занимать 99% времени если не 1099% (вы же хотите fullhd/4k 60 fps? а скорости может тупо не хватить), не говоря уже о самом преобразовании форматов.

    Поэтому вам придется решить инженерную задачу, как расшарить данные между текстурой в памяти видеокарты, в которой лежит экран и вашим cuda приложением, и я боюсь это будет тот еще квест, там наверняка и права доступа весело вылезут, и привязка к чипу видеокарты и что-нибудь еще.

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

    p.s. nvidia уже вроде несколько лет назад пиарилась на том что разработала такие алгоритмы для эффективного стриминга экрана приложений и игр по сети с минимальной задержкой, в т.ч. в железе.
    https://developer.nvidia.com/nvidia-video-codec-sdk
    Ответ написан
    Комментировать
  • Как автоматизировать сборку зависимостей программы?

    @rPman
    Возьмите тот же make, мы все привыкли что makefile содержат какой-нибудь автогенирированный эпический код, в котором уже давно никто полноценно не разбирается, но вообще то это неплозая система автоматического контроля версий файлов и сборки с учетом зависимостей.

    Когда вы пишите
    целевой_файл:используемые файлы
      командная строка для сборки целевого файла
    вы фактически описываете процесс, когда make проверяет версии используемых файлов по цепочкам зависимостей автоматически и запускает соответствующие команды.

    Для каждой своей зависимости у вас можно написать bat-файл, который переходит в нужный каталог и пересобирает ее, затем копирует результат в каталог вашего проекта. Вы можете для каждого написать по паре строчек в вашем makefile указав в качестве используемых файлов вообще все файлы каждого проекта или лучше какой-нибудь один (например index файл из их git каталога) и все, при любом обновлении у вас будет происходить запуск сборки. Затем вы можете добавить этот makefile в ваш проект (либо вручную прописать его вызов) на сколько я помню в visual studio есть куча возможностей для этого.

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

    @rPman
    ищите библиотеки для работы с DMI есть по до все операционные системы
    не уверен, но кажется память либо вся работает в многоканальном режиме либо нет, это флаг на ее всю.
    Ответ написан
    Комментировать
  • Брут 18 значного числа?

    @rPman
    https://gist.github.com/epixoip/a83d38f412b4737e99...
    8x Nvidia GTX 1080 дает ~ 200Gh/s
    т.е. ваш диапазон оно переберет за пару месяцев (возможно незначительно быстрее, так как входящая строка у вас очень маленькая).
    Ответ написан
    Комментировать