• Правильно ли я доказываю?

    @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
    Программист на «си с крестами» и не только
    Я пока вижу
    printf("%f", a);
    Не нужно брать адрес у a.

    while(s>=0.0001)
    1) Дробные числа во всех ЯП записываются через точку. Кое ради какой вещи (параллельные циклы) в Си есть операция «запятая», так что код может даже компилироваться.
    2) Цикл не выполнится ни разу, т.к. 0 < 0,0001.
    Ответ написан
    Комментировать
  • Как понять: массив указателей на объекты классов?

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

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

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

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

    @Mercury13
    Программист на «си с крестами» и не только
    Не совсем так. Главное требование — симметричный шум, иначе оценка будет смещённой.
    Но в случае нормального шума МНК превращается в метод максимального правдоподобия. Просто посмотрите на формулу шума, а потом прологарифмируйте.
    Ответ написан
    Комментировать
  • Почему 150/1000 == 0?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что деление происходит int/int, то есть целочисленное.
    Надо 150.0/1000.

    Это известный глюк Си-подобных языков — a/b в зависимости от типа или деление, или неполное частное. В Паскале, например, неполное частное — a div b. В Си-подобных языках с динамической типизацией (JS) отказались от неполного частного, ибо мы тип плохо контролируем.
    Ответ написан
    8 комментариев
  • Как работает метод кодирования 4B3T?

    @Mercury13
    Программист на «си с крестами» и не только
    Начинаем с какой-нибудь суммы, например, 2.
    биты 0000, сумма 2 — по таблице 0−0, от суммы отнимаем 1, получается 1.
    Приходят снова биты 0000, сумма 1 — по таблице уже +0+, к сумме прибавляем 2, получается 3.
    Вот так мы балансируем средний ток через канал связи на уровне нуля.
    Ответ написан
    4 комментария
  • Как составить список пути используя алгоритм BFS?

    @Mercury13
    Программист на «си с крестами» и не только
    Вместо
    boolean[][] visited = new boolean[ROW][COL];

    надо сделать такое:
    static final byte DIR_UNKNOWN = 0;
    static final byte DIR_UP = 1;
    ...
    
    byte[][] bestDirection = new boolean[ROW][COL];  // изначально заполнено DIR_UNKNOWN


    for (int dir = DIR_UP; dir <= DIR_RIGHT; ++dir) {
      ...
      bestDirection[row][col] = dir;
    }

    Добравшись до финиша, делаем обратный ход. А именно: определяем, какой bestDirection у финиша, и если он, например, DIR_UP — смещаемся на 1 вниз. И так далее, пока не доберёмся до старта.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Blink (именно он) странно ведёт себя, если margin/padding span’а задан в процентах. Видимо, там есть какой-то внутренний кэш шрифтов, и он для определения нужного размера span’а берёт устаревшие цифры.
    Попробуйте помасштабировать страницу, и увидите, как пляшут надписи.
    Вообще никто не говорит, как должен действовать margin в % для span’а. Но метод центровки откровенно странный и представляет собой ручную подгонку под желаемое (причём очень грубую). Я бы сделал достаточно большой блок и в нём бы отцентрировал иконку и надпись. Если какой-то рендерер не уместит надпись в одну строку — ну пускай…

    UPD. Уточняю: Blink так ведёт себя, когда в блоке есть замкнутый круг: из-за float’а его ширина зависит от вёрстки текста в нём; из-за процентных отступов вёрстка текста зависит от размера блока.
    Ответ написан
    4 комментария
  • Как правильно передавать функцию как параметр C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Не забывайте, что у startManufacturing есть скрытый параметр this.

    Четыре варианта.

    1. Использовать указатель на метод App:
    Rest::function(char * function_name, int (App::* f)(String), App& object)
          // вместо App можно какой-то интерфейс, который App реализует
    …
    object.*f("string");
    ...
    bt_rest.function("", &App::startManufacturing, *this);


    2. Сделать startManufacturing static:
    class App {
      static int startManufacturing(String command)
    };


    3. Сделать обёртку с замыканием:
    Rest::function(char * function_name, int (*f)(String, void*), void*);
    
    void doStartManufacturing(String command, void* closure) {
      reinterpret_cast<App*>(closure)->startManufacturing(command);
    }
    ...
    bt_rest.function("startManufacturing", doStartManufacturing, this);


    4. «Избегай незнакомых женщин и глобальных переменных». Костыль, в общем.
    App app;
    int doStartManufacturing(String command) { return app.startManufacturing(command); }
    ...
    bt_rest.function("startManufacturing", doStartManufacturing);


    Ах да. Вы передаёте String’и по значению. Приспособлены они к такой передаче или всё же лучше по ссылке?
    Ответ написан
    6 комментариев
  • Как нарисовать линию с помощью алгоритма Брезенхема и гамма-коррекции в текстовом файле?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы работал по такой формуле:

    result = ((original / max)1 / gamma) · 255

    Original — это полученное алгоритмом Ву значение (float или хотя бы short!)
    max — максимально возможное значение original. Для short, например, это 65535.
    gamma — традиционно 2,2.
    Ответ написан
    Комментировать
  • Как работает scanf в плюсах?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Для ввода строки использовать std::getline.
    2. Ну, в Си++ есть хорошо инкапсулированные строки, а в Си нет. Потому в Си очень сложно получить из потока строку неизвестной длины.
    Ответ написан
  • Почему не работает new c++?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть такое понятие, как «принцип подстановки Барбары Лисков». Если подставить на место User класс Comparator, должно сойтись по типам. Но нет: User умеет сравнивать только с самим собой, а Comparator — с любым Comparator.

    Теоретически должно было бы подойти такое (так называемая контравариантность). Но не работает ни в Си++, ни в Яве.
    class ComparatorBase
    {
    public:
        virtual ~ComparatorBase() = default;
    };
    
    class Comparator : public ComparatorBase {
        public:
            virtual int compare(Comparator  *t)=0;
    };
    
    class User : public Comparator{
    public:
        int compare(ComparatorBase *u) override {
            return 1;
        }
    };

    А по возвращаемому значению (если возвращается ссылка/указатель) может быть ковариантность, и она работает и в Си++, и в Яве.
    class Father
    {
    public:
        virtual Father& foo();
        virtual ~Father() = default;
    };
    
    class Son : public Father
    {
    public:
        Son& foo() override;
    };


    Как обойти. Есть два способа.
    Способ 1. Пусть старой Явы.
    int User::compare(Comparator *u)
    {
        auto* v = dynamic_cast<User*>(u);
        if (!v)
            return false;
        return v->name > this->name;
    }


    Способ 2. Так называемый «странно рекуррентный шаблон».
    template <class T>
    class Comparator {
    public:
        virtual int compare(T *t)=0;
        virtual ~Comparator() = default;
    };
    
    class User : public Comparator<User> {
    private:
        std::string name;
    public:
        User(std::string name){this->name=name;}
        int compare(User *u);
        void showName(){std::cout<<"Name "<<this->name<<std::endl;}
    
    };
    
    int User::compare(User *u)
    {
        return u->name > this->name;
    }
    Ответ написан
    Комментировать
  • Какие есть способы перевода с одного типа данных в другой?

    @Mercury13
    Программист на «си с крестами» и не только
    1. С использованием функций преобразования типа, встроенных в Си++ или написанных пользователем. Это может делаться неявно, через C-style cast, через вызов конструктора, через операцию static_cast.
    2. С преобразованием указателя вниз по иерархии наследования, и особым поведением, если это не получилось, через операцию dynamic_cast и функцию dynamic_pointer_cast.
    3. С рассмотрением участка памяти как переменной несовместимого типа. Через union, const_cast, reinterpret_cast, C-style cast указателей.
    Ответ написан
    Комментировать
  • Что значит оформить страницу лицензии в ПДФ?

    @Mercury13
    Программист на «си с крестами» и не только
    Это значит: в какой программе вы бы ни писали лицензию, но на выходе должен получиться PDF.
    Этот PDF может быть создан виртуальным принтером, встроенным или внешним конвертером в PDF.
    Ответ написан
    Комментировать
  • Как не переноситься на следующую строку после scanf?

    @Mercury13
    Программист на «си с крестами» и не только
    Без особого консольного API той или иной ОС — никак. Потому что строка передаётся в консоль, когда пользователь нажимает на ввод.
    Ответ написан
    Комментировать
  • Как называется это понятие?

    @Mercury13
    Программист на «си с крестами» и не только
    Самомодифицирующийся код.
    Ответ написан
    Комментировать