Ответы пользователя по тегу C++
  • Программа на С++ не работает. Что я делаю не так?

    @xandox
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    
    int main(int, char**) {
        char symbol = ',';
        std::ifstream input_file("txt.txt");
        int line_number = 0;
        std::string current_line;
        while (std::getline(input_file, current_line)) {
            auto symbols_in_string = std::count(current_line.begin(), current_line.end(), symbol);
            std::cout << "'" << symbol << "' in line " << line_number + 1 << ": " << symbols_in_string << std::endl;
            line_number += 1;
        }
        return 0;
    }
    Ответ написан
    Комментировать
  • Ошибка в блоке try-catch, почему возникает данная проблема? Как исправить баг?

    @xandox
    у тебя происходит следующие:
    1) ты вводишь "2a"
    2) cin >> number; читает 2, смотрит что следующий символ не цифра и возвращает тебе 2 оставляя "a" в потоке ввода.
    3) срабатывает твоя основная логика
    4) идет переход к п.1, но в потоке уже есть "a" и по этому cin не дожидается никакого ввода сразу завершается с ошибкой, о чем и сообщает твоя "Ошибка типа"
    Ответ написан
    Комментировать
  • Как происходит линковка приложений?

    @xandox
    runime - это по сути просто стандартная библиотека. Прослойка между вашим кодом и ABI системы. Как и любой другой код он может быть как статический так и динамический. У статического и динамического runtime-а свои плюсы и минусы.
    Приведу некоторые из них
    У статического
    + Нет зависимостей, все что нужно исполняемому файлу - только операционная система.
    + Как следствие предыдущего пункта, ОС что бы его запустить нужно прочитать с диска и инициализировать только один файл. Потенциально может ускорить запуск приложения.
    - Размер файла сильно возрастает
    - Использование dll (ну если вдруг захочется плагины, например, к себе прикрутить) сильно усложняется. Надо быть довольно осторожным.

    У динамического
    + Размер файла не распухает
    + Рантайм делиться со всеми загруженными dll, по сути присутсвует в единственом экземпляре.
    + Работать с dll становиться немного проще.
    - Что бы хоть чего-нибудь запустилось - нужно позаботиться о том, что на машине установлен нужный вам рантайм, что усложняет процесс доставки конечного продукта до пользователя. По сути уже нужно делать инсталер.
    - Нужно следить, что все динамические библиотеки которые используется в приложение были собраны с нужным рантаймомо. Это не всегда тривиально.

    Теперь про вопросы.
    1) Нет. msvcr120.dll - это просто рантайм от VS2012, у VS2015 будет что-то msvcr140.dll. У gcc - что-то еще. Как я уже говорил, runtime - это просто код, который нужно куда-то положить. И у каждого поставщика стандартной библиотеки он свой.
    2) Да это правда. Основное отличие - это поддержка стандартов и расширений. VS2010 от с++11 поддерживала совсем ничего, а вот VS2015 уже поддерживает c++11/14 и немного 17 (ну с оговорками на MS и о том как они поддерживают стандарты). Это тоже код и его куда-то нужно положить. Плюс, довольно распростроненная проблема - это ABI. Порядок полей в классах (например), который никак не оговаривается стандартом, делает бинарные реализации не совместимыми, если порядок не совпадает (если сильно по простому).
    3) Там лежит стандартная библиотека.
    4) Нет, на то она и dll. Но как правило многие библиотеки распространяются в двух видах - динамическая линковка + статическая. Или если это opensource всегда можно для себя собрать статичскеую библиотеку для того что бы статически слинковаться.
    5) Конечно, что-то добавляет. Runtime C++ добавляет еще больше. Плюс надо понимать, что еще есть runtime для OC, который позволяет вызвать ее функции как функции, а не через прерывания или еще как. Теоретически можно работать без всего этого добра, но будет грустно.
    Ответ написан
    Комментировать
  • Есть 4 байта в них записана информация как их прочитать сразу?

    @xandox
    #include <cstdint> // хэдр для uint32_t
    
    std::uint32_t value; // переменная, гарантировано 4 байта
    // предполагаю, что inp наследник std::istream
    inp.read(reinterpret_cast<char*>(&value), sizeof(value)); //кастим наши 4 байта в char*-буфер, sizeof(value) == 4
    
    std::cout << value; // ну и выводим, что получилось
    Ответ написан
    1 комментарий
  • Бесконечный цикл в Qthead, как сделать правильно?

    @xandox
    Если я правильно помню то сигналы к слоту из потока надо цеплять с флагом Qt::QueuedConnection
    а в нутриях цикла, когда понимаешь, что можно бы обработать внешние сигналы надо звать QEventLoop::processEvents
    Ответ написан
  • Почему обнуляется статический член класса?

    @xandox
    поробуй вместо
    inline static s_ptr current()
       {
          return s_ptr(current_, boost::detail::sp_nothrow_tag());
       }

    вот это
    inline static s_ptr current()
       {
          return current_.lock();
       }

    а когда это сломается, прочитай первый ответ.
    Ответ написан
    Комментировать
  • Что теоретически может больше ограничить скорость потоков?

    @xandox
    Если используешь hdd, то при активном чтении из разных мест диска тебе хватит и 3-4 потока, что бы просиживать время в iowait. Для ssd не незнаю - надо мереть.
    Ответ написан
    Комментировать
  • Автоматическое тестирование C++ кода (на Perl)?

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

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

    @xandox
    я вам возможно сейчас жизнь сломаю, но вот вам
    #include <string>
    #include <utility>
    #include <iostream>
    
    class CredentialsInfo {
        std::string _login, _password;
    
    public:
        CredentialsInfo() {}
        CredentialsInfo(const std::string& login, const std::string& password)
            : _login(login)
            , _password(password)
        { }
    
    public:
        std::string Login() const {
            return _login;
        }
    
        std::string Password() const {
            return _password;
        }
    
        void SetLogin(const std::string& newLogin) {
            _login = newLogin;
        }
    
        void SetPassword(const std::string& newPassword) {
            _password = newPassword;
        }
    
        friend std::ostream& operator<<(std::ostream&, const CredentialsInfo&);
    };
    
    std::ostream& operator<<(std::ostream& out, const CredentialsInfo& info) {
        return out << info._login << "; " << info._password;
    }
    
    template <class DataClass>
    class Queue {
    public:
        typedef DataClass   value_type;
    
    private:
        struct QueueNode {
            value_type Value;
            QueueNode* Next;
    
            QueueNode(value_type&& value)
                : Value(std::move(value))
                , Next(nullptr)
            { }
        };
    
        QueueNode *_head, *_tail;
    
    public:
        Queue()
            : _head(nullptr)
            , _tail(nullptr)
        { }
    
        ~Queue() {
            while(_head) {
                auto tmp = _head;
                _head = _head->Next;
                delete tmp;
            }
        }
    
    public:
        template <class Data>
        void Add(Data&& data) {
            auto* newNode = new QueueNode(std::forward<Data>(data));
            if (_head) {
                _tail->Next = newNode;
                _tail = newNode;
            } else {
                _head = _tail = newNode;
            }
        }
    
        template<class... Args>
        void Add(Args&&... args) {
            Add(value_type(std::forward<Args>(args)...));
        }
    
        void Show(std::ostream& out) const {
            auto it = _head;
            while (it) {
                out << it->Value << '\n';
                it = it->Next;
            }
            out.flush();
        }
    };
    
    typedef Queue<CredentialsInfo> CredentialsQueue;
    
    int main(int, char**) {
        CredentialsQueue queue;
    
        queue.Add("s", "ss");
        queue.Add("1", "op");
        queue.Add("1", "p");
        queue.Show(std::cout);
        return 0;
    }
    Ответ написан
    Комментировать
  • Почему приложение подвисает на удаленной машине при отключении от последней?

    @xandox
    запускай через task scheduler
    Ответ написан
    Комментировать
  • Как откомпилировать функцию в исполняемый код без "связей"?

    @xandox
    То, что ты описал сильно смахивает на модули ядра linux, которые по сути есть обычные объектные файлы, которые при подгрузке в ядро проходят стадию линковки. Можно начать смотреть от туда.
    Правда у меня есть опасение, что такое вообще возможно сделать в user space без всяких очень грязных хаков, все таки как ни крути, а исполнение произвольного кода считается дырой в безопасности системы. Но я не настоящий сварщик, по этому могу ошибаться.

    Что бы получить объектный файл у gcc и clang есть опция -c. У VS тоже что-то такое точно должно быть, но у меня нет VS по этому посмотреть не могу. Попробуй запустить cc1{что-то-там}.exe с /? - он наверника скажет.
    Ответ написан
    Комментировать
  • Как сформировать набор байт для пересылки через сокет Windows?

    @xandox
    std::uint64_t length = GetMessageLength(); // ну тут наверное разбирешся
    length = host_to_bigendian(length); // смотри для своей платформы как перевести в big endian
    const char* lengthBytes = static_cast<const char*>(&length); // в памяти все и так как нужно уже лежит 
    send(socket, lengthBytes, sizeof(length));
    Ответ написан
    Комментировать
  • Как правильно масштабировать реконструированный объект в виртуальном 3d пространстве, используя OpenCV?

    @xandox
    После калибровки CameraMatrix (матрица A) имеет коэффициенты fx, fy порядка ~1000

    Это и есть масштаб. К чему он приводит зависит от того в чем ты передавал XYZ
    Ответ написан
    Комментировать
  • Как передать аргументом указатель на элемент массива - члена класса?

    @xandox
    А чем функоторы-то не угодили?
    Ответ написан
    Комментировать
  • Почему не видно определение класса?

    @xandox
    странная конструкция, что ты ей хотел сказать?
    #include "MyClasses.h"
    class MyClass;


    если нужен forward declaration, то делай так
    namespace my { class MyClass; }

    если нужна переменная, то
    my::MyClass myClass;

    к UPD
    Слушай, у тебя какой-то полный бардак
    Ты во-первых определись как называется твой класс MyClass или MyClasses. По тому что у тебя в коде написано одно, а в ошибке совершенное другое.
    Во-вторых точка с запятой после инклуда тебе зачем?
    И да покажи уже свой заголовчник и место где ты его пытаешься использовать. И еще - у тебя дополнительно нет ошибки, что не получилось найти MyClasses.h ?
    Ответ написан
  • Java - тормозит, а Cи - нет?

    @xandox
    Да не, и на java можно писать так что бы не тормозило. Только почему-то никто этого не делает...
    Ответ написан
  • Есть ли механизм проверки валидности указателей в C++?

    @xandox
    То что ты хочешь сделать не возможно, да и не нужно, если пользователь отдал тебе указатель, а потом освободил его - то он сам дурак и с этим ничего не поделать. Единственное, что я тебе бы посоветовал использовать shared_ptr, что бы пользователю было бы легче следить за временем жизни своего объекта. В принципе тебе можно хранить weak_ptr и при вызове проверять - не протух ли он.
    Ответ написан
    Комментировать
  • Как в C++ назначить одному вектору значение другого?

    @xandox
    Твой assign не работает потому, что он не принимает vector как аргумент :)
    en.cppreference.com/w/cpp/container/vector/assign

    vector1.assign(vector2.begin(), vector2.end());
    Ответ написан
    Комментировать
  • Как получить локаль системы из std::setlocale?

    @xandox
    1) если используешь c++ то используй лучше std::locale
    2) читай внимательно man - там написано, что если аргумент locale (он второй) равен NULL, то возвращается текущая локаль
    3) по умолчанию, вполне возможно, что будет установлена сишная локаль, по этому сначала установи какую нужно, а потом получай
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
    
    int main() {
        printf("%s\n", setlocale(LC_ALL, NULL));
        printf("%s\n", setlocale(LC_ALL, "ru_RU.UTF-8"));
        printf("%s\n", setlocale(LC_ALL, NULL));
        return 0;
    }

    ➜  /tmp  gcc test.c
    ➜  /tmp  ./a.out
    C
    ru_RU.UTF-8
    ru_RU.UTF-8
    Ответ написан
    Комментировать
  • Обертка на сырые данные?

    @xandox
    Твое решение очень напоминает google protocol buffers, и как следствие, если есть возможность, я бы посоветовал не изобретать велосипед, а взять готовое решение

    по поводу твоего вопроса - посмотри как сделано это в protocol buffers
    если коротко
    есть три вида поля required, optional, repeated (required - нас сейчас не интересует), если во входящем сообщении встречается несколько раз optional или required - то берется последнее из этих значений для поля, если поле repeated - то все значения добавляются в коллекцию.

    P.S protocol buffers - бинарный протокол, но умеет и текстовое представление. Не очень понимаю зачем в 21 веке кому-то мог понадобиться xml? У него есть три оригинальных (в смысле от гугла) реализации + куча совместимых для разных языков.
    Ответ написан
    7 комментариев