• Как получить наименьший целочисленный тип, способный вместить число n?

    Vindicar
    @Vindicar
    Szewczyk, ну если коротко, union подразумевает несколько полей разных типов, только в отличие от структуры они расположены "поверх" друг другоа в одной памяти. Чем-то похоже на reinterprest cast, только для фиксированного набора типов.
    Минимальный пример

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    typedef union {
        struct { //один вариант - безымянная структура из двух полей
            uint16_t LowWord;
            uint16_t HighWord;
        };
        uint32_t DoubleWord; //второй вариант 
    } DOUBLEWORD;
    
    int main()
    {
        DOUBLEWORD w;
        cout << sizeof(w) << " bytes" << endl; //4 bytes - по размеру наибольшего члена union
        //заполняем память, используя первый вариант.
        w.LowWord = 0x0001;
        w.HighWord = 0x0002;
        //читаем, используя второй вариант
        cout << hex << setw(8) << setfill('0') << w.DoubleWord << endl; //00020001
    }



    В твоём случае будет что-то типа...
    typedef struct {
        size_t item_count;
        enum { UINT8, UINT16, UINT32, UINT64 } item_type;
        union {
            void* voidPtr;
            uint8_t* bytePtr;
            uint16_t* wordPtr;
            uint32_t* ulongPtr;
            uint64_t* quadPtr;
        } ptr;
    } MultiTypeArray;

    Тогда при обращении к массиву нужно будет посмотреть на значение поля item_type, и обратиться к нужному полю xxxxxPtr.
    MultiTypeArray arr;
    arr.item_count = 16;
    arr.item_type = MultiTypeArray::UINT32;
    arr.ptr.voidPtr = malloc(sizeof(uint32_t) * arr.item_count);
    for (size_t i = 0; i < arr.item_count; i++)
        arr.ptr.ulongPtr[i] = i;

    Можно прикрутить метод-хелпер типа uint8_t& as_byte(size_t index);, но это не сделает работу сильно удобнее.
    Написано
  • Как сделать из кода пайтон exe файл?

    Vindicar
    @Vindicar
    Exter, повторяю вопрос. Тебе критично, чтобы скрипт и все его причиндалы были упакованы в один exe файл? Потому что в этом режиме скрипт при запуске сначала распаковывается во временную папку, а потом запускается оттуда. Больше действий, больше шансов что что-то пойдёт не так.

    Есть режим --onefolder, когда созданный экзешник, интерпретатор питона и библиотеки лежат внутри одного каталога, в разных файлах. Тогда будет достаточно подложить нужный тебе файл в этот каталог, и потом искать его рядом со скриптом. Каталог скрипта можно узнать через sys.argv[0].
    Написано
  • Как сделать цикл разархированния файлов zip?

    Vindicar
    @Vindicar
    Artem Mikhniuk, ну так извлеки папку через zip_file.extract(), а потом переименуй её через os.rename(). os.path в помощь, чтобы извлечь имя из пути к zip-файлу.
    Написано
  • Почему callback_query_handler не видит call.data?

    Vindicar
    @Vindicar
    Александр, если у тебя в боте только одна клавиатура, то твоего кода хватит.
    Если же нет, то этот вопрос уже задавали.
    Написано
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    Vindicar
    @Vindicar
    djEban, я не настолько хорошо знаю плюсы, но я бы сначала попробовал передать параметр по ссылке
    void bit_set(uint8_t& port, uint8_t bit)
    Но не факт, что это заработает! В конце концов, передача по ссылке - это передача адреса в памяти, а у регистра процессора адреса нет...

    Так что да, может, придётся использовать макрос. Да оно и быстрее будет.
    Написано
  • Как правильно использовать оператор or в pyautogui?

    Vindicar
    @Vindicar
    Там ещё веселее
    NOTE: As of version 0.9.41, if the locate functions can’t find the provided image, they’ll raise ImageNotFoundException instead of returning None.
    Написано
  • Как это решать?

    Vindicar
    @Vindicar
    HedgeHog1234, у тебя d в какой-то момент времени оказывается None.
    Я подозреваю, что это потому что ты делаешь вызов
    u = main(n-d[i], k.remove(d[i]))
    В d присвоится значение, возвращённое k.remove(d[i]). Ты думаешь, что remove() возвращает копию списка без указанного элемента? Ты ошибаешься, remove() изменяет список на месте (т.е. он останется изменённым после возврата из рекурсии) и возвращает None.

    Перечитай мой совет насчёт сортировки. Так реально будет проще.
    Написано
  • Как сделать, чтобы message.text смотрел на только что введеный, а не старый текст?

    Vindicar
    @Vindicar
    Оформи код как положено правилами сайта. Кнопка </> в помощь.
    Написано
  • Python Requests авторизация на сайте, как получить значения которые генирируются js?

    Vindicar
    @Vindicar
    dopr, откуда я знаю, какой там алгоритм?
    Просто логически рассуждая, у сайта этот алгоритм реализован на сервере и на клиенте.
    Таким образом сервер может проверить, что клиент отдал правильный код авторизации. Если клиент отдал правильный код, значит он выполнил JS скрипт, отданный сервером. А если он выполнил скрипт, значит это скорее всего браузер, а не бот.
    Написано
  • Python Requests авторизация на сайте, как получить значения которые генирируются js?

    Vindicar
    @Vindicar
    dopr, как ты себе представляешь другое решение?
    Тебе нужен код авторизации. Ты или генерируешь его сам, по тому же алгоритму (чтобы получилось такое же значение, как на сайте), или позволяешь сайту сгенерировать его за тебя.
    Написано
  • Как найти в файле тхт нужную строку и добавить к ней другую переменную?

    Vindicar
    @Vindicar
    Ramazan095, я это описал.
    Делишь прочитанную строку на куски, потом куски меняешь, если надо, и собираешь обратно в строку.
    Что-то типа такого (для одной строки, source и destination - объекты-файлы)
    line = source.readline()
    try:
        line_id, x, y = line.split()
        line_id = int(line_id)  # если надо. у тебя id число или строка?
        x = int(x)
        y = int(y)
        ...  #  тут проверяешь line_id, что-то делаешь с x и y
        line = f'{line_id} {x} {y}\n'  # новая строка с измененными значениями
    except Exception as err: 
        # если что не так, строку не меняем, просто фиксируем ошибку в консоль
        print('Bad line:', line)
        print('Error:', err)
    finally:  # в итоге пишем строку в новый файл
        destination.write(line)
    Написано
  • Как заменить дескриптор __get__ метода класса?

    Vindicar
    @Vindicar
    Встречный вопрос: а зачем тебе? Если тебе нужно, чтобы в разных случаях вызывалась разная реализация my_meth(), используй наследование, или помести логику выбора реализации прямо внутрь my_meth().
    Написано
  • Как найти в файле тхт нужную строку и добавить к ней другую переменную?

    Vindicar
    @Vindicar
    Вообще-то в таком случае стоит задуматься об использовании другого хранилища, а не текстового файла.
    Написано
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    Malley, потенциально возможно. Словарь - это же непростая структура данных, там под капотом сложная механика, чтобы обеспечить доступ по ключу быстрее чем за O(N). Впрочем, я плотно в код не вчитывался, стоит посмотреть, что ещё используется несколькими потоками. В общем, для межпоточной сигнализации есть threading.Lock (питоновский эквивалент мьютекса), посмотри в его сторону.
    Написано
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    Malley, уффф. Ну вообще-то такие вещи надо в учебнике читать, но объясню на пальцах:
    Когда два потока обращаются на запись к одной структуре данных, всегда возникает вероятность, что что-то пойдёт не так. Именно вероятность, так как это зависит от момента переключения управления с одного потока на другой. Это называется состояние гонки, и это очень хреново, потому что связанные с этим баги могут то появляться, то исчезать, то вести себя иначе - смотря когда переключение потоков будет происходить.
    Поэтому если у тебя два или более потоков пишут (или читают+пишут) в одну структуру данных, нужно гарантировать, что запись не будет происходить одновременно с другими операциями. Простейший способ - использовать мьютекс. Мьютекс может быть захвачен только одним потоком в один момент времени. Так что если захватывать мьютекс перед работой с общей структурой данных, и отпускать после работы, то потоки будут работать со структурой строго по очереди, а в остальное время будут работать параллельно.
    Если же у тебя только одновременное чтение данных в памяти, без записи, то это не проблема.

    В твоём случае у тебя одновременное обращение могло сломать словарь.
    Написано
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    Malley, а ты со словарём работаешь из нескольких потоков? Если да, что из-под мьютекса, или так?
    Написано
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    Malley, решений три. Добавил их в ответ.
    Написано
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    Malley, и что с того? У тебя в коде 2 выполнение идёт в несколько потоков. Если код выполняется в отдельном потоке, то по умолчанию любой код, который он вызывает, тоже выполняется в этом потоке. Ты обращаешься к функциям кода 1 из нескольких потоков - значит, они выполняются в нескольких потоках.
    Написано
  • Почему переменная all_participants принимает только 10000 значений, а не больше при парсинге?

    Vindicar
    @Vindicar
    Код нечитаем, оформи его как требуют правила сайта. Кнопка </> в помощь.
    Написано
  • Выполнение задач с разным временем?

    Vindicar
    @Vindicar
    Так в чём вопрос-то?
    За тебя код написать?
    Написано