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

    @Mercury13
    Программист на «си с крестами» и не только
    1. У вас неверное условие (z[i].birth >= ageyoungest).
    2. Никакой защиты от переполнения буфера в scanf.
    3. Идентификатор birth реально означает возраст. Плохо.
    4. Неверное условие
    if (z[i].education == "master" || z[i].education == "specialist" || z[i].education == "bachelor")
    . Для массивов это просто сравнение адреса массива с адресом вкомпилированной в программу строчки, что автоматически даёт false. Используйте str(n)cmp.
    5. Излишнее условие
    else if (z[i].education != "master" || z[i].education != "specialist" || z[i].education != "bachelor")
    . Оно автоматически выполнено.
    6. Отсутствует delete[] employees;
    Ответ написан
    Комментировать
  • В чем проблема файла std lib facilities.h?

    @Mercury13
    Программист на «си с крестами» и не только
    Проблема в подключённом к нему файле hash_list или hash_map (они никогда не были стандартом Си++, но по факту их многие реализовывали, с двумя разными стандартами — один от SGI, второй переименованный вошёл в STL).
    Переименуйте в unordered_list, unordered_map. И надейтесь, что третий и далее параметры шаблонов не использовались.

    Существуют версии этого файла, откорректированные под C++11.

    А можно заглушить ошибку, добавив в «#defines» проекта _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS. И будьте готовы, что в один прекрасный день вы обновите компилятор и хватитесь этого файла.
    Ответ написан
    Комментировать
  • Почему появляется ошибка при выделении памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Чему равняется nChilds?
    2. Сам-то CalculateCountOfObjectsInside() в порядке?
    3. Случайно наша система не ходит по каталогам «.» и «..»?
    Ответ написан
    3 комментария
  • Что изучить C или C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Информационная безопасность требует от вас понимать, что такое эксплойт. Потому нужны оба языка. Может, не очень глубоко, но какой-то код надо писать на том и на другом.
    Дело в том, что «няшная сишка» стала отличным полигоном для эксплойтов, да и низкоуровневые библиотеки пишут часто на ней (для компактности). А на Си++ пишут современный софт.
    Раз вы на ПэХаПэ, вы не понимаете, что такое указатель, и потому лучше начать с Си++. Просто потому, что как-то можно программировать без указателей, а понять, что это за чёрт указатель — дело наживное.
    Ответ написан
  • Как создать связный список?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Виртуальный деструктор тут нужен — ведь в списке будут вперемешку элементы разных классов.
    2. Не видны два компонента, которые и делают список связным — указатель на следующий элемент (test* next) и указатель на голову (test* head = NULL).
    3. В попытке скрыть реальную жизненную задачу — ведь СС не вещь в себе, а решает какую-то задачу вроде «держать список объектов в игре» — вы слишком уж напереименовывались.
    Ответ написан
    4 комментария
  • Есть ли игры в открытом мире с круглой землей (картой)?

    @Mercury13
    Программист на «си с крестами» и не только
    В первую очередь авиасимуляторы. Знаю, что из-за масштабов Земли им приходится справляться с ошибками float: если Земля 12000 км в поперечнике, то единица младшего разряда — полметра.
    Первый X-COM имел круглую землю, но полёты были по локсодроме. А вот в опенсорсном ремейке 2014 года полёты уже по большому кругу.
    Симуляторы бога от Питера Молиньё: Populous, Black and White. Возможно, и другие симуляторы богов (например, Spore — не проверял).

    Я говорю именно про шарообразную карту, а не трубу/тор.

    А так — я бы предостерёг от шарообразной земли с открытым миром. 1) Расстояния (глобальная карта с ускоренным временем или без времени не в счёт). 2) Навигация по миру (в том числе понятие «север»), проекция миникарты. 3) В какой-то момент нужно закругляться и выкатывать игру, а в какой-то — выдавать аддон. Тяжеловато будет. Кстати, во всех упомянутых играх мир или замкнутый, или намного больше, чем одна планета.

    P.S. Моё определение открытого мира: игра, дающая относительную свободу действий и передвижения, но локальный участок, где орудует игрок/группа, намного меньше мира. В замкнутом мире, наоборот, участник орудует практически по всему «миру», оперативно переходя с одного участка на другой. Есть и пограничные случаи: огромное побережье нового Hitman — открытый мир или замкнутый?
    Ответ написан
    1 комментарий
  • Почему на 4-х ядерном процессоре происходит эмуляция 12-и ядерного?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Такую работу со счётчиком threadEnd лучше делать через std::atomic.
    2. В вашем процессоре два гипертредированных ядра, 4 потока.
    3. Главный поток ждёт-крутится. «1 поток» — это работают ДВА потока (не забывайте, главный просто крутится). «2 потока» — это ТРИ потока, два настоящих ядра и одно виртуальное — потому результаты не вдвое ниже. Так что вижу локальный минимум на трёх потоках, это верно. У меня на рабочем 8-поточном процессоре, как и полагается, даёт минимум на семи потоках.
    4. Условие if (natur > 0) кажется излишним.
    5. Вижу большой разброс результатов. То ли таймер недостаточно точный, то ли компьютер загружен кучей посторонней работы — таким результатам доверять не стоит.
    Ответ написан
    2 комментария
  • В чем проблема??

    @Mercury13
    Программист на «си с крестами» и не только
    Если упустить знак & вместо &&, в вашем коде три проблемы.
    1. Часть сравнений излишни: например, из тройки a >= b && a >= c && c <= b второе не нужно. Можно просто писать: c <= b && b <= a.
    2. Часть сравнений повторяется. Лучше было бы работать
    if (a >= b) {
       // куча сравнений
    } else {
       // ещё одна куча
    }

    3, самое главное. Может случиться, что ни одна ветка не сработает, и в переменных будет мусор! Непонятно, какова задача, так что не могу сказать, как исправить. Если независимо друг от друга отсортировать две тройки — зачем вы всё это делаете одним оператором?
    Ответ написан
    Комментировать
  • Как вставить значение строки как аргумент функции?

    @Mercury13
    Программист на «си с крестами» и не только
    1. В строковой переменной или строковом буфере собрать тело команды, экранируя параметры, если это нужно.
    2. Если это обёрнутый string, преобразовать в const char* — и пошёл.
    std::string command;
    char data1 = 'F';
    char data2 = 'C';
    command = std::string("color ") + data1 + data2;
    system(command.c_str());
    Ответ написан
    1 комментарий
  • Особености функций malloc/calloc/new?

    @Mercury13
    Программист на «си с крестами» и не только
    UPD2. Что значит «очищают данные»?

    а) Очищают данные = освобождают память. Сделать функцию, которая выделяет память в локальную переменную (и эта переменная, была бы уничтожена мусорщиком Java, вместе с выделенным массивом).

    1. Выяснить, сколько памяти свободно.
    2. Вызвать функцию.
    3. Выяснить ещё раз, сколько памяти свободно.
    4. Подождать пару секунд («мусорщик» точно сработал бы).
    5. Выяснить третий раз, сколько памяти свободно.
    Поскольку в C++ мусорщика нет, должно быть 1 > 3 = 5.

    Узнать кол-во памяти — дело непортабельное, на Windows и Linux свои функции, см. stackoverflow.com/questions/2513505/how-to-get-ava...

    UPD1. На Windows лучше использовать GetProcessMemoryInfo. В таком случае надо смотреть, сколько памяти программа съедает, и тогда 1 < 3 = 5. Поскольку внутренний менеджер памяти на своём уровне «закрысивает» немного памяти, лучше выделять много памяти, порядка мегабайта.

    б) Очищают данные = забивают их нулями (наверно, всё-таки это). Выделить буфер подлиннее (или кучу буферов по одному int) и убедиться, что там не нули. Желательно компилировать программу на разных настройках — например, в Debug программа может забивать данные нулями или чем-то вроде DEADBEEF, а в Release — выдавать мусор.
    Ответ написан
  • Как в C++ распределяется память?

    @Mercury13
    Программист на «си с крестами» и не только
    Это называется фрагментация памяти. Некоторые «мусорщики» (как в Java или C#) способны сдвинуть объекты и получить большой непрерывный отрезок.
    Менеджер памяти C++ дефрагментировать память не способен и выдаст нехватку памяти.
    В любом случае, массив — что в Java, что в C++ — будет занимать непрерывный отрезок памяти.

    Чтобы совмещать мусорные языки с системными интерфейсами, есть способы пометить структуру как неперемещаемую. Но это уже на стыке виртуальной машины Java/C# и системного кода, который пишется на Си(++).
    Ответ написан
    9 комментариев
  • Почему не сохраняет и не выводит последнее введенное число?

    @Mercury13
    Программист на «си с крестами» и не только
    Код while (cin >> val) подразумевает, что мы ждём конца консоли.
    Если консоль перенаправлена из файла — ну, с этим всё понятно.
    А если нужно сделать конец в настоящей консоли, нажмите Ctrl+Z.

    Код высчитывает количество введённых подряд одинаковых чисел; если мы вводим другое или заканчиваем поток — он выводит, сколько их было.
    Ответ написан
    Комментировать
  • Qmake not using precompiled headers?

    @Mercury13
    Программист на «си с крестами» и не только
    По документации Qt, нельзя.

    Зато можно исключить Си++ из предкомпиляции простым методом.

    // Add C includes here
    
    #if defined __cplusplus
    // Add C++ includes here
    #include <stdlib>
    #include <iostream>
    #include <vector>
    #include <QApplication> // Qt includes
    #include <QPushButton>
    #include <QLabel>
    #include "thirdparty/include/libmain.h"
    #include "my_stable_class.h"
    ...
    #endif


    doc.qt.io/qt-5/qmake-precompiledheaders.html

    Самому так пригодилось (правда, на MinGW, а не на MSVC).
    Ответ написан
    1 комментарий
  • Как реализовать наследование статического поля/метода, если это возможно?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое. Объясни, для себя и для меня, что собой представляет объект Command?

    Моё видение — разделить объекты Command (введённая пользователем и разобранная строка) и Program (программа, реализующая команду). Также я нарисовал — хочешь, используй, хочешь, нет — объект Console (консоль ввода-вывода) и System (окружение программы вроде текущего каталога, переменных окружения, файловой системы).

    Я тут работаю со значениями и указателями, в терминах C++03, но, возможно, вас заинтересуют умные указатели C++11.

    std::string commandLine = console.getSomeCommandLine();
    Command command;
    std::string error;
    if (!command.parse(commandLine, error)) {
      console.err().writeln(error);
      return;
    }
    Program* program = system.findProgram(command.programName);
    if (!program) {
      console.err().writeln("Bad command or file name");
      return;
    }
    Console redirectedConsole = console.redirectStreams(command);
    program->exec(redirectedConsole, system, command.getArguments());


    Второе. Возвращай ссылки, это быстрее.
    const std::vector<std::string>& getArguments() const;
    const std::vector<std::string>& getOptions() const;
    Ответ написан
  • Почему не работает libcurl?

    @Mercury13
    Программист на «си с крестами» и не только
    Как ни странно, нужна версия libcurl с поддержкой HTTPS.
    Большинству таких версий в нагрузку нужны два файла OpenSSL — libeay32.dll, ssleay32.dll.
    Ответ написан
    Комментировать
  • Ошибка C++ Builder XE Unable to open file 'ODBCPROVIDER150.OBJ'. Кто-нибудь поможет?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Этого файла не будет, он скрыт в файле с расширением lib. Найдём его. Если нет — значит, библиотека не была скомпилирована под Builder.
    2. Tools → Options → C++ Options → Paths and Directories → Library Path.
    Ответ написан
    Комментировать
  • Qt. Как использовать сигналы-слоты?

    @Mercury13
    Программист на «си с крестами» и не только
    Нет, мы заводим где-то новый слот и подаём сигнал в него.
    Есть два способа завести новый слот: либо унаследоваться от QObject или его наследника (удобно унаследовать главную форму), либо воспользоваться лямбда-функцией C++11. Поскольку все наши формы на стеке, проще всего написать лямбду.

    connect(&Button, &QPushButton::clicked, 
                &Base, [&]() {
            // тут код
        });


    В реальных проектах каждая форма является наследником от QWidget (или чего-то подобного) и хранит свои компоненты. А слоты — это функции в форме.
    Ответ написан
    7 комментариев
  • C++ Builder и ProgressBar. Как сделать постоянное отображение квадратика бегающего слева направо?

    @Mercury13
    Программист на «си с крестами» и не только
    Нужно дать возможность оконным сообщениям ходить и обрабатываться.

    Простой способ. Поминутное Application->ProcessMessages().
    Сложный способ. Вынести долгую операцию в поток.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Что вы имеете в виду? Инициализировать и закрыть библиотеку по мере появления-исчезновения объектов? Вот мой код (работает с cURL, но понятно).

    В чём его смысл? Как только объект cURL требуется первый раз, инициализируем глобальный объект. Теперь, скорее всего, cURL будет разрушен с его деструктором. Но если в каком-то потоке объект cURL будет слишком долго жить — ничего, подождём.

    (Внимание, тут гонка, если одновременно потребуются два объекта cURL. Нам такое не нужно, но если вдруг — защитите по принципу Singleton’а.)

    namespace curl {
    
        std::atomic<size_t> nLib(0);
    
        class _Lib
        {
        public:
            bool isIn = false;
            ~_Lib();
        };
    
        _Lib lib;
    
        void addLib()
        {
            int q = ++nLib;
            if (q == 1) {
                lib.isIn = true;
                q = ++nLib;
                curl_global_init(CURL_GLOBAL_ALL);
            }
            //std::cout << "Added lib, now " << q << std::endl;
        }
    
        void releaseLib()
        {
            int q = --nLib;
            if (q == 0) {
                //std::cout << "Cleaned up lib" << std::endl;
                curl_global_cleanup();
            } else {
                //std::cout << "Released lib, now " << q << std::endl;
            }
        }
    
        _Lib::~_Lib()
        {
            if (isIn)
                releaseLib();
        }
    
    }
    
    curl::Curl::Curl()
    {
        addLib();
        fData.handle = curl_easy_init();
    }
    
    curl::Curl::~Curl()
    {
        if (fData.handle)
            curl_easy_cleanup(fData.handle);
        releaseLib();
    }
    Ответ написан
    Комментировать
  • Как перевести число в строку с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Ошибка вот где.
    else {
                cout<<"False";
                return 0;
            }
        }

    Проверяет только первую цифру, и если она не 3 — сразу же говорит false.
    Ответ написан