• Как убрать раскладку физической клавиатуры (Android 9, EMUI, Gboard)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока самая удачная прога, которую я нашёл,— External Keyboard Helper Demo и Pro. Она сама управляет своими раскладками. Недостаток — при подключении железной клавы нужно переключать метод ввода.
    Ответ написан
    Комментировать
  • Почему Segmentation fault?

    @Mercury13
    Программист на «си с крестами» и не только
    Переменная run ничему не присвоена.
    Ответ написан
    Комментировать
  • Как к четырем элементам массива добавить ещё два?

    @Mercury13
    Программист на «си с крестами» и не только
    Нужен или массив с запасом (например, на 6 мест), или динамический (например, std::vector).
    Си++ — язык достаточно низкого уровня, и сам программист видит, где там память динамически выделяется, а где выделена заранее.
    Ответ написан
    2 комментария
  • Какова цель ddos атак, и зачем они нужны?

    @Mercury13
    Программист на «си с крестами» и не только
    Пока DDoS’ят, восстановить в исходном виде нельзя. Потому что ничего не сломалось, просто не выдерживает нагрузку. Даже если мы перезагрузим все сервера, они снова упадут под натиском запросов.
    Только спрятаться за анти-DDoS’ными службами.

    Цель — временно остановить работу сервера, понятное дело. И без меня это написали, зачем.
    Ответ написан
    Комментировать
  • Hash талица это асоциативный массив индексов и адрессов в памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    Производительность хэш-таблиц — O(1) в среднем. Усреднённое по всем возможным наборам данных, если хэш-функция хорошо перемешивает.

    Хэш-таблица действует так. Допустим, у нас выпало значение хэш-функции 1234 и у нас в хэш-таблице 100 гнёзд. Тогда наш элемент где-то в гнезде 34. Когда расширим таблицу до 200 гнёзд, элемент останется в гнезде 34, а когда расширим до 1000 — он переедет в гнездо 234.

    Как разрешаются коллизии (два элемента в одном гнезде) — зависит от реализации: например, в гнезде могут быть связанные списки элементов.

    Для словарей, если тот строится раз и до конца своей (не)долгой жизни, можно применить и другой способ, совершенно неубиенный и дешёвый по памяти. Взять массив, построить и отсортировать. Бинарный поиск — O(log n).
    Ответ написан
    2 комментария
  • Объясните разбор файла mainwindow.h в QT по шагам?

    @Mercury13
    Программист на «си с крестами» и не только
    // Защита от повторного включения
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    // Пара include’ов
    #include <QWidget>
    #include <QMainWindow>
    
    // Определение UI-класса наперёд, чтобы визуальное редактирование не приводило
    // к крупным перекомпиляциям
    namespace Ui {
    class MainWindow;
    }
    
    // Собственно класс формы
    class MainWindow : public QMainWindow
    {
        // Макрос, который добавляет файл в компиляцию MOC’ом,
        // а также реализует пару функций
        Q_OBJECT
    
    public:
        // Конструктор-деструктор.
        // Форма семантически не эквивалентна parent’у,
        // потому конструктор explicit
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    // Слоты — фишка Qt, которая обрабатывается MOC’ом
    private slots:
    
    
    private:
        // Указатель на UI (для него в Qt есть ещё одна программа, UIC)
        Ui::MainWindow *ui;
    };
    
    // Защита от повторного включения
    #endif // MAINWINDOW_H


    Что ещё написать?

    Определение класса наперёд не мешает писать указатели и ссылки.

    Конструктор explicit запрещает неявное преобразование. Explicit имеет смысл, если возможен вызов конструктора с одним параметром. Правило таково: ставь explicit, если твой объект по смыслу не эквивалентен единственному параметру конструктора. Например, Ratio(int x);, но explicit Array(int x);: при построении рационального числа из целого будет полный эквивалент, но при построении массива — нет.
    Ответ написан
    Комментировать
  • Почему пробел заменяется на W?

    @Mercury13
    Программист на «си с крестами» и не только
    Пробел не isupper.

    Расчёт тут идёт в знаковом типе, потому *i + key - 97 < 0

    Существует два метода деления с остатком, в x86 встроен тот, где знак остатка равняется знаку делимого (а неполное частное — результат округления к нулю). Именно его впоследствии кодифицировали в Си99. Значит, (*i + key - 97) % 26 < 0

    Это значит, что результат преобразования будет меньше 97 = 'a'. Например, 'W'.

    Ах да. В Си можно написать (*i + key - 'a') % 26 + 'a'.
    Ответ написан
    Комментировать
  • Что значит сокрытие?

    @Mercury13
    Программист на «си с крестами» и не только
    Это значит: должно быть сложно или невозможно вывести объект из «адекватного» состояния (которое называется инвариант класса). Все чувствительные поля при этом прячутся от посторонних глаз. (Разумеется, могут быть «небезопасные» методы, но тогда пользователь сам себе злобный буратино).

    PHP управляет памятью сам (что-то мне кажется, что метод управления памятью там «бросай объект и шут с ним»). Но давайте представим себе, что надо вызывать команду «уничтожить объект», и дальнейшее обращение к освобождённому указателю некорректно. Попробуем сделать объект «указатель множественного владения».

    В каждом из управляемых объектов налаживаем счётчик; при переприсваивании на счётчике будет такая цифра, сколько указателей «смотрят» на объект. Счётчик упадёт до нуля — объект уничтожается. Соответственно, поле управляемого объекта «счётчик» и поле указателя «указатель на объект» скрываются. «Адекватное состояние» я уже описал: «на счётчике будет такая цифра, сколько указателей «смотрят» на объект. Счётчик упадёт до нуля — объект уничтожается».
    Ответ написан
    Комментировать
  • Как быстро выбирать подстроку у строки?

    @Mercury13
    Программист на «си с крестами» и не только
    Использовать кольцевой буфер. Придётся пописать немного, но на что это нужно и какова будет сложность остальных работ?
    Ответ написан
    2 комментария
  • Как грамотно осуществить декомпозицию?

    @Mercury13
    Программист на «си с крестами» и не только
    typedef struct ttime {
    Си, на ++ не нужен typedef.
    И используй наконец тэги для кода.

    int hours; int minute; int sec;
    Странное именование, обычно пишут hour.

    struct date {
    ttime time;

    которая в свою очередь входит в состав структуры Date.
    Странно, ведь это не дата, а скорее Clock — часы.

    Методы позволяют изменять текущее время

    Ну и где тут измерение?

    Моя архитектура.
    1. Время. Получение времени из системы, сравнение, вывод в консоль.
    2. Часы. Хранят последнее время. Команда «tick» — получить время, сравнить с последним, при неравенстве — сохранить новое и вывести его в консоль.
    3. Внешний цикл (может быть как в часах, так и снаружи). Часы тикают, делают небольшую задержку и проверяют на нажатие клавиши.
    Пять объектов никак не будет, да и Date нужно только в том случае, если вы реально работаете с датой. Я бы, чтобы докинуть количество объектов до нужного, сделал бы дату (date), время (time) и дату-время (stamp).

    Для турнира единоборств (для простоты — без весовых категорий).
    • Fighter: имя, всякая информация про него вроде города, клуба и титулов.
    • Stub: указатель на Fight + enum (Winner/Loser) — откуда берётся участник. Указателя на Fight нет — тогда TBD (то есть не определился).
    • Participant: указатель на Fighter + структура stub.
    • Fight: номер, два Participant, дата/время, кто победил (0/1), причина победы (ещё не проводился, KO, TKO, по очкам, неявка…)
    • Tournament: содержит список боёв и таблицу результатов.

    Можно также разорвать кольцо зависимостей, наладив интерфейс FightInfo, сделав в Stub FightInfo*, а не Fight*, и чтобы Fight реализовывал FightInfo.
    Ответ написан
  • Что такое «распределение Нэша» (Nash distribution)?

    @Mercury13
    Программист на «си с крестами» и не только
    Известная теорема теории игр (теорема Нэша).
    Любая матричная игра имеет равновесие Нэша в смешанных стратегиях.
    А смешанная стратегия — это распределение, с какой вероятностью брать ту или эту стратегию.

    Таким образом, распределение Нэша — это та «случайная смесь» стратегий, которая уныла и надёжна, как и полагается равновесию Нэша. Например, для игры «камень-ножницы-бумага» распределение Нэша — все три фигуры по ⅓.
    Ответ написан
    Комментировать
  • Как разобраться, что происходит в этом заголовочном файле?

    @Mercury13
    Программист на «си с крестами» и не только
    Учи понятие «единица компиляции». Тут, к сожалению, есть и вещи, которые должны быть в CPP-файле, и вещи, которые должны быть в H-файле.

    #pragma pack(1)
    Структуры данных нам нужны «один в один», без байтов заполнения.

    struct FileHeader 
    struct MAPINFO

    Формат BMP. Не забывай, что формат BMP записывается с нижней строки!

    Функция Open читает картинку «один в один», Save пишет «один в один», GetMapInfo и GetFH выдают какие-то заголовки нашего BMP.

    Остаётся GetMap(), который, по идее, должен выдавать матрицу цветов, но реально действует только для 32-битного BMP и никак не инкапсулирует ни ширину-высоту матрицы, ни тот факт, что формат BMP пишется с нижней строки.

    За этот код — тройка с минусом.

    А теперь чего ваш код НЕ поддерживает, но, по идее, должен, чтобы выполнить вашу задачу.
    1. Создание BMP нужного размера с нуля, а не загрузка из файла.
    2. Инкапсулировать матрицу пикселей. Желательно так, чтобы был быстрый доступ к строкам как к буферам в памяти, для простоты переноса информации из старого BMP в новый, на 30×30 пикселей больший.
    3. Если вы ограниченно поддерживаете формат BMP — вылетать с ошибкой, если версия неподдерживаемая (например, не то количество цветов).

    Задача именно своими силами наладить поддержку BMP? А то в Builder’е есть TBitmap.
    Ответ написан
    6 комментариев
  • Как организовать указатели в си?

    @Mercury13
    Программист на «си с крестами» и не только
    Дело тут в очерёдности операций.
    Сначала вычисляются правые одноместные, потом левые.

    Надо (**h)[1] = 0;.
    Ответ написан
    Комментировать
  • Qt checkbox this combobox?

    @Mercury13
    Программист на «си с крестами» и не только
    Через сигналы-слоты способа не вижу.
    Унаследоваться от QStandardItemModel, присосаться на setModelData.
    А ещё лучше унаследоваться от QAbstractTableModel и переопределить все эти data(), flags()…
    Ответ написан
    Комментировать
  • Правильно ли я доказываю?

    @Mercury13
    Программист на «си с крестами» и не только
    Если множества X(·) произвольные — утверждение неверно. Точнее, верна только первая часть — правое включается в левое.
    A = B = {0,1}
    X(a,b) = {a xor b}
    ⋂{a}⋃{b} X(a,b) = [X(0,0) ⋃ X(0,1)] ⋂ [X(1,0) ⋃ X(1,1)] = {0,1}⋂{0,1} = {0,1}
    ⋃{b}⋂{a} X(a,b) = [X(0,0) ⋂ X(1,0)] ⋃ [X(0,1) ⋂ X(1,1)] = ∅ ⋃ ∅ = ∅

    Ваша ошибка: в (4.1) ∀a ∃b̂(a), т.е. этот b с крышей зависит от a. Соответственно, в (5.,1) â зависит от b, и никак не наладишь противоречие.
    Ответ написан
  • Передача ссылки на экземпляр объекта из конструктора?

    @Mercury13
    Программист на «си с крестами» и не только
    Дело у вас вот в чём. Файл Part_Of_Word.h напоминает единицу компиляции (*.cpp), но имеет расширение заголовочного файла (*.h). После того, как вы удалили все его include’ы, эти функции просто перестали компилироваться.

    А до этого, вангую, у вас было два include’а — а значит, две копии одной функции из разных единиц компиляции. Тоже ошибка линкера.

    Решение: переименовать этот файл в cpp.
    Ответ написан
    Комментировать
  • Циклы. While, do while, for, чем отличаются?

    @Mercury13
    Программист на «си с крестами» и не только
    While — сначала проверь, потом сделай, и так по кругу.
    Do — сначала сделай, потом проверь, и так по кругу.

    Отличаются они только случаем, когда условие не выполняется: while не пройдёт, а do пройдёт один раз.
    // Пример 1.
    // верно
    while (впереди свободно) шаг;
    // неверно — можно врезаться в препятствие, если нельзя сделать ни шагу
    do шаг while (впереди свободно);
    
    // Пример 2.
    // Неверно — пока у вас в руках нет рубашки, условие цикла некорректно
    while (рубашка грязная) возьми рубашку;
    // верно
    do возьми рубашку; while (рубашка грязная);


    Циклы for, foreach и прочие — это разновидность цикла while (не do!!), сделанная для специального сценария: пройти некий набор объектов.
    Ответ написан
    Комментировать
  • И снова clang: Почему (при оптимизации) реализация на указателях получилась хуже чем с использованием оператора [ ]?

    @Mercury13
    Программист на «си с крестами» и не только
    Интересно тут другое. Компилятор первую версию превращает во вторую — базово-индексная адресация очень быстра, а дважды прибавлять единицу — не лучший вариант. К тому же он обнаруживает параллельные циклы и устраивает им одинаковый индекс.

    Кстати, посмотри интереса ради gcc -Os.
    Ответ написан
    6 комментариев
  • Какая графика используется в игровых движках?(вектор или растр.)И как вообще устроен графический редактор в них?

    @Mercury13
    Программист на «си с крестами» и не только
    Трёхмерная графика не бывает векторной и растровой. У неё там свои разновидности, и там она используется полигональная. Текстуры, разумеется, растровые. Существуют псевдовекторные элементы вроде поля расстояний, но это именно что «псевдо-».

    Двухмерная — в подавляющем большинстве случаев растровая, но и векторные элементы бывают.
    Ответ написан
    Комментировать
  • Как понять: массив указателей на объекты классов?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы тут просто не знаете, что такое указатель. А это, грубо говоря, адрес другого объекта в памяти.
    Операция new заводит объект в «куче», вызывает конструктор (если таковой есть) и возвращает указатель на него.
    И мы можем разыменовать указатель: пройти на тот объект, куда он указывает, и сделать с ним что-то. В Си разыменование — операция ->.

    Указатели не на абстрактный класс, а на вполне конкретный, a.

    a(int) — не конструктор копирования, а просто конструктор, делающий объект из int’а. Конструктор копирования всегда a(const a&). Отличается от других конструкторов тем, что автоматика его по возможности строит, но не всегда верно. В вашем объекте с одним полем int вполне себе построит без всяких проблем.

    Обычный указатель Си никоим образом не знает, есть объект или нет, и кто этот объект уничтожает. У вас это приводит к ошибке «утечка памяти»: теряется указатель на объект, и уже никак его не освободишь. Из-за небольшого размера и линейного характера программы неопасно, но всё-таки.
    Ответ написан
    Комментировать