Задать вопрос
  • Как решать задачу на булеву логику?

    @Xiran Автор вопроса
    Написал код
    Код

    #include <cassert>
    #include <iostream>
    
    constexpr std::uint8_t THREE_BITS_MAX = 7, THREE_ARY_BOOL_FN_MAX = 255;
    
    inline bool get_nth_bit(int reg, int x) {
        return (reg >> x) & 1;
    }
    
    template<std::size_t M>
    class iteratable {
    public:
        inline void next() {
            if (raw_ == M) {
                is_end_ = true;
                return;
            }
    
            raw_++;
        }
    
        inline bool is_end() const {
            return is_end_;
        }
    protected:
        std::uint8_t raw_ { 0 };
        bool is_end_ { 0 };
    };
    
    class three_bits_pack : public iteratable<THREE_BITS_MAX> {
    public:
        inline bool operator[](std::size_t index) const {
            assert(index <= 3);
    
            return get_nth_bit(raw_, index);
        }
    
        inline auto raw() const {
            return raw_;
        }
    };
    
    
    class three_ary_bool_fn : public iteratable<THREE_ARY_BOOL_FN_MAX> {
    public:
        inline bool operator()(const three_bits_pack &pack) const {
            return get_nth_bit(raw_, pack.raw());
        }
    };
    
    int main() {
        int counter = 0;
    
        for (three_ary_bool_fn a_fn; !a_fn.is_end(); a_fn.next()) {
            for (three_ary_bool_fn b_fn; !b_fn.is_end(); b_fn.next()) {
                for (three_bits_pack abc; !abc.is_end(); abc.next()) {
                    if (a_fn(abc) && !b_fn(abc))
                        goto next;
    
                    for (three_bits_pack def; !def.is_end(); def.next()) {
                        if (!(!abc[0] || !abc[1] || !abc[2] || a_fn(def)))
                            goto next;
    
                        if (!(def[0] || def[1] || def[2] || b_fn(abc)))
                            goto next;
                    }
                }
                counter++;
    next:;
            }
        }
    
        std::cout << counter;
    }



    "Трюк" основан на том, что любую логическую 3-арную функцию можно представить как 8 битов, где номер каждого бита равен комбинации битов, которые от этой функции дают этот самый бит.
    Только вот ничего не работает как надо. Выдает 1 и все, а должно 5103.
    Ответ написан
  • Не могу, понять как компьютер перемещает свой знак?

    @Xiran
    На мой взгляд, функция написана "лишь бы работало". Может для проекта за 3-значную сумму и сгодится, но никак не для книги, тем более для новичков.
    Верно, winner(board) == computer проверяет, выигрывает ли компьютер при данном значении board. Если же да, то выходим из цикла. Если нет, перебираем дальше.
    Ответ написан
    Комментировать
  • Как получить доступ до полей tVariant после миграции с MSVC на CMake (g++) MinGw и CLion?

    @Xiran
    Вы в комментариях говорили о флаге -fms-extensions, вот, скопируйте в CMakeLists.txt:
    add_compile_options(-fms-extensions).
    Ответ написан
    Комментировать
  • Мне надо иметь две .lib для debug и release?

    @Xiran
    Тебе обязательно делать только под MSVC? Для библиотек рекомендую CMake.
    Ответ написан
    Комментировать
  • Как можно улучшить код?

    @Xiran
    Я бы так:
    #include <iostream>
    #include <intrin.h>
    
    #pragma intrinsic(_BitScanReverse)
    
    inline bool bitCheck(int number, int n) {
        return (number >> n) & 1;
    }
    
    int main() {
        int input = 0;
        
        std::cin >> input;
    
        const bool negative = input < 0;
    
        if (negative) {
            input = -input;
        
            std::cout << '-';
        }
    
        const int bwidth = _BitScanReverse(&index, input)) ? index + 1 : 1;
    
        for (int i = bwidth - 1; i >= 0; i--)
            std::cout << bitCheck(input, i);
    }
    Ответ написан
    Комментировать
  • Как оформить некорректный ввод значений в наследниках?

    @Xiran
    Тебе нужен CRTP, или шаблон Traits, а если тебе нужно хранить их в какой-то структуре данных (массив, список, дерево, ...), просто сделай интерфейс и "наследуй" базовый класс от него
    Ответ написан
    Комментировать
  • Как создаются трансляторы?

    @Xiran
    Можно попробовать LLVM.
    P. S. Сам с этим никогда не работал
    Ответ написан
    Комментировать
  • Как вернуть до пяти типов из одной функции?

    @Xiran
    Или так:

    void drawObject(sf::Drawable &out) {
    	out = /* Возвращаемое значение */;
    }
    
    void test() {
    	sf::CircleShape circleShape { /* ... */ };
    	
    	drawObject(circleShape); // circleShape = drawObject();
    	
    	// ...
    }


    Однако ссылку/указатель на локальный (объявленный в функции) объект возвращать нельзя,
    ибо стек функции (там хранятся такие объекты) будет очищен после вызова функции в соответствии
    с конвенцией, которую использует функция (обычно __cdecl, в вызовах нестатических функций-членов - __thiscall).
    Ответ написан
    Комментировать
  • Ошибка в Visual studio opengl. Как решить?

    @Xiran
    Добавь opengl32.lib в Properties/Linker/Input.
    + неплохо было бы вам разобраться, как работать с msvc'шным линкером, ибо тогда можно будет самому решать подобные проблемы
    Ответ написан
    Комментировать
  • Как присвоить динамическому массиву типа void* значение в Си?

    @Xiran
    Что вообще значит
    динамический массив типа void*
    ?
    Например:
    void **ptrArr = malloc(sizeof(*ptrArr) * N);
    
    // ...
    
    free(ptrArr);

    , где ptrArr - область памяти, способная хранить N указателей, т. е.
    динамический массив (это понятие мне не нравится) из N указателей.

    Вы просто где-то отдельно выделяете память для int'ов, char'ов, и т. д., и записываете указатели в этот массив, по необходимости расширяя его (тут, на мой взгляд, лучше проявит себя список).
    Ответ написан
    Комментировать
  • Как преобразовать std::function в указатель на функцию?

    @Xiran
    Как-то так:
    auto callback = [](auto, void *data) {
    	QMessagebox::warning(reinterpret_cast</* Имя класса */>(data), "WIFI", "WIFI отключился");
    }
    
    WlanRegisterNotification(/* ... */, callback, this, /* ... */);


    void* - тоже самое, что и PVOID.
    Если будут ошибки компиляции, отправьте их.
    Ответ написан
  • Происходит ли нарушение инкапсуляции, если реализация хранится в .h-файлах?

    @Xiran
    Это даже отдельный вариант оформления кода, header-only называется. Используется повсеместно в Boost.
    Никакого отношения к инкапсуляции это не имеет, пользуйтесь на здоровье.
    Если захотите объявление спрятать членов обычного класса в .cpp, ознакомитесь с идиомами d-pointer и q-pointer.
    Ответ написан
    Комментировать
  • Что такое событие в ООП?

    @Xiran
    События могут пригодится при написании, например, фреймворка для управления задачами. Вот статья на этот счет: https://habr.com/ru/companies/jugru/articles/446562/
    Ответ написан
    Комментировать
  • Ошибки при сборке проекта с подключением SFML?

    @Xiran
    Установи MSVC версии 141 (от VS 2017) и измени настройки проекта под нее и еще скриншот пришли.
    Ответ написан
    Комментировать