• Как в qDebug() реализован перевод на новую строку?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Думаю большого ответа по данному поводу не надо. Опишу примерно.

    Макрос qDebug возвращает временный объект QDebug в который пишутся какие-либо данные. После ";'" он, как временный объект, уничтожается. А в деструкторе он просто вызывает функцию "qt_message_output", которая пишет куда-либо, не суть, и передает в нее все накопленные параметры. И именно эта функция добавляет newline в вывод.
    Ответ написан
    2 комментария
  • Как в std::map в ячейку "значение" положить функцию?

    xorknown
    @xorknown
    Будут проблемы - решайте
    В c++ у нестатических функций класса всегда неявно присутствует аргумент который является указателем на объект класса. Таким образом у вас у указателя на функцию start тип -> void (*) (Admin::ServerManager*).

    Вам каким-то образом надо передавать этот указатель, либо исправить что-то в определении функций, для примера можно использовать лямбда функции которые будут содержать в себе указатель.
    Ответ написан
    Комментировать
  • Что должна вернуть С функция snail на codewars?

    xorknown
    @xorknown
    Будут проблемы - решайте
    1) Возвращаемое значение функции - указатель на массив (int*)
    2) Первый параметр функции outsz - записать размер возвращаемого массива
    Ответ написан
    Комментировать
  • Как вернуть разные типы из std::function?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Идея так делать невероятно плохая, но если хочется можно использовать std::variant(или std::any) из C++17

    std::function func{[](int z) -> std::variant<X, Y> {
                    if (z>0) {
                        return X();
                    }
    
                    return Y();
                }
            };
    
        std::variant<X, Y> v = func(1);
    Ответ написан
    Комментировать
  • Почему не работает эхо сервер на boost::asio?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Проблема в выборе контейнера для сокетов. У вектора есть особенность, он распределяет все свои элементы последовательно в памяти и заранее выделяет под них память. В какой-то момент, при добавлении элемента, к примеру, он может изменить расположение этого последовательного участка в памяти. И получается что в своих потоках вы ссылаетесь на память в которой сокеты уже не находятся. std::vector::reserve лишь временное откладываение проблемы, которая покажет себя при большем кол-ве подключений.
    Следует задуматься о замене вектора на std::list , к примеру, который не имеет данной особенности.
    Ответ написан
  • Как следить за знаком переменной при переполнении в C++?

    xorknown
    @xorknown
    Будут проблемы - решайте
    У вас неправильный подход. Если взять абстрактную машину, то нельзя следить за знаком переменной, так как стандарт не гарантирует, что он изменится. Вам вообще по факту переполнять нельзя.
    Вам надо определить это до самого переполнения. Самый тупой способ - вычесть из максимального числа один из аргументов и сравнить полученное число со вторым аргументом(если полученное число меньше, то значит переполнение).
    Ответ написан
    Комментировать
  • Как получить доступ к наследованной переменной из функции базового класса?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не уверен, что вы код написали верно. Но чтобы просто получить доступ к переменной имя которой вы скрыли,
    достаточно просто написать имя базового класса::переменная(Base::myvar).
    Вопрос в другом, нужна ли вам переменная myvar в Another?
    UPD: неправильно прочитал.
    Инициализируйте переменную myvar в наследуемом классе. В Another у вас совсем другая переменная которая никак не относится к myvar base, просто уберите ее.
    Если вы хотите инициализировать myvar в конструкторе то вам надо завести конструктор base принимающий аргумент
    class Base {
    protected:
       int myvar;
       void useBaseVar(){
         cout << myvar << endl; // вывод 42
       }
    public:
       Base() : myvar(10) {}
       Base(int  val) : myvar(val) {}
       ~Base() {}
    };
    
    
    class Another : public Base {
    public:
       Another() : Base(42) {}
       void useMyVar() {
         useBaseVar();
       }
    };
    Ответ написан
    3 комментария
  • Как мне записать 1 строку двумерного масива в одномерний?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не забывайте, что массивы у вас разных размеров, и все строка из ar не влезет в al.
    Старайтесь забыть про сырые массивы и использовать контейнеры.
    for (int i = 0; i < std::size(al); i++) {
        al[i] = ar[0][i];
    }
    Ответ написан
    Комментировать
  • Как работает данный кусок кода на Си?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Вам бы всё-таки к книге обратиться, а не к данному ресурсу.
    Очищать память, если имеется ввиду освобождать, надо только после выделения памяти. Если ваша программа где-либо вызывает malloc и т.п., то нужно вызывать free, не иначе.
    Динамические массивы и массивы большого размера лучше не выделять на стеке. Можно во время выполнения поймать переполнение стека. И при выделении массива помните, что память не бесконеча, и вам может ее не хватить. Опять же, если прочитать документацию, то realloc можете вызывать только после обязательного вызова malloc. Это все работа с аллокаторами, которые работают с динамической памятью.

    Максимальный размер name. Name - это указатель, в котором хранится адрес, адрес на память. В нем не хранится ни размер, ни данные о том на что он указывает, ему без разницы, он всегда будет одного размера. В вашем случае, при компиляции в программе заранее выделяется память под все текстовые данные которые указаны у вас в коде, на них и указывает указатель. Если вы захотите сохранять введённые данные, то вам придется воспользоваться выделением памяти.
    Ответ написан
    Комментировать
  • Member with constructor not allowed in anonymous aggregate?

    xorknown
    @xorknown
    Будут проблемы - решайте
    1)
    #define GLFW
    #ifdef GLFW
    
    class GLFW : public IWindowSystem 
    -> class : public IWindowSystem {}


    Вы определяете пустой макрос с именем GLFW, потом создаете класс с таким же названием. Чего вы этим добиваетесь?

    2) Сигнатуры методов IWindowSystem и GLFW отлючаются
    virtual IWindow *createFullScreenWindow(char **title) = 0;
    -> virtual IWindow *createFullScreenWindow(const char *title) {}
    Ответ написан
    2 комментария
  • Лицензия QT или QT Creator?

    xorknown
    @xorknown
    Будут проблемы - решайте
    В качестве особого исключения вы можете создавать проекты, содержащие выходные данные этого приложения(qtcreator), и распространять их в соответствии с условиями по вашему выбору, до тех пор, пока они не будут иным образом получены из этого приложения или основаны на нем, и до тех пор, пока сам проект не будет генерировать выходные данные, содержащие выходные данные этого приложения в его первоначальном или измененном виде.

    Вольный перевод первых же строчек из лицензии qtcreator.
    Ответ написан
    Комментировать
  • Обьявление и Определение Шаблона метода?

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

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

    xorknown
    @xorknown
    Будут проблемы - решайте
    Как минимум функции f у вас разные. В c++ вы берете корень из всего выражения, а в питоне только от этой части (1 + x**2)
    Ответ написан
    Комментировать
  • Почему компилятор ругается?

    xorknown
    @xorknown
    Будут проблемы - решайте
    По стандарту Си он вычисляется как logical-OR-expression ? expression : conditional-expression - это означает, что второй операнд может быть любым выражением(даже применять оператор ,), а третий операнд подчиняется логике приоритета и должен быть выше или равен по сравнению с тернарным оператором. В данном случае это вычисляется как ((ch == 'h') ? (high = guess) : low) = guess. Оператор ?: возвращает временное значение, и компилятор говорит об этом.
    Ответ написан
    2 комментария
  • Каким образом лучше управлять памятью?

    xorknown
    @xorknown
    Будут проблемы - решайте
    1) Стандарт гарантирует, что sizeof(char) == 1
    2) В с++, к сожалению, не так много встроенных хороших способов обработки ошибок, поэтому лучше использовать исключения. Они понятны всем, не придется создавать CFB::CompoundFileReader в случае ошибки в GetReader и не будет простыни из if-ов на каждый вызов функции. Но не забывай очищать память и закрывать файлы перед бросанием исключения. Лучше пользоваться RAII.
    3) Smart pointer-ы на самом деле не такие уж и плохие менеджеры памяти, почему бы не использовать их. Из ReadStream можно просто возвращать unique_ptr, а в случае с буффером для CFR, если их время жизни должно совпадать, то почему бы не хранить их вместе.
    class ReaderWatcher {
    public:
        ReaderWatcher(std::shared_ptr<unsigned char[]> b, size_t len)
         : buffer(std::move(b)), reader(b.get(), len) {}
    
        Reader* operator ->() {
            return &reader;
        }
    
        Reader get() {
            return reader;
        }
    
    private:
        std::shared_ptr<unsigned char[]> buffer {nullptr};
        Reader reader;
    };
    Ответ написан
    Комментировать
  • Когда использовать malloc() или calloc()?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Если кратко, то во время выполнения программы есть две области памяти в которых можно выделять память.
    Стек отличается скоростью выделения пространства для переменной, но ограничен по размерам и времени жизни самой переменной(Она уничтожается при выходе из области видимости). Следственно большие, долгоживущие объекты не всегда разумно создавать на стеке.
    Куча же наоборот, более дорогая операция по времени выделения памяти, но время жизни переменных контролируешь ты сам и места там больше в среднем. Аллокаторы(malloc, calloc и т.п.) как раз выделяют память в куче.
    Ответ написан
    Комментировать
  • Как скомпилировать проект, если там используется объект еще не существующего класса (C++, пишу библиотеку)?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Во-первых, функции main в библиотеке быть не может, библиотека - просто расширение функционала для проекта в котором будет использоваться. Main - служит начальной точкой для исполняемых приложений, если сильно не извращаться, а следственно должна быть определена только в проекте, который собирается быть исполняемым.

    Во-вторых, в чем проблема с MainScene? Вы просто создаете интерфейс базового класса, потом пользуетесь им получая указатель на объект его реализации, просто необходимо дать пользователю возможность отправить этот указатель вам через какую-либо функцию библиотеки.
    Ответ написан
  • Почему программа сервера не дает следующие подключения?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не до конца уверен, но по моему на данную строчку кода хотя бы стоит обратить внимание
    while (true)
                {
                    int count = 0;
                    for (int i = 0; i < maxclients; i++)
                        if (args[i].lalk->exit)
                            count++;
                    if (count == maxclients)
                        break;
                }


    Дело в том, что c++ по логике своей однопоточный язык, поэтому при оптимизации он не опирается на то, что другой поток может изменить переменную в цикле. А так как твоя структура arg_s(Лучше конечно названия более осмысленные применять) никак не помечена, то он просто грузит bool переменную в регистр и бесконечно крутится в цикле. Более подробнее можно прочитать здесь .

    Опять же судя по годболту эта проблема и присутствует, но не уверен что у тебя включена оптимизация
    Ответ написан