Обновить
23

Пользователь

1
Подписчики
Отправить сообщение

Почти на 100% уверен, что там бесконечная крутилка, как колёсико мыши.

В стабильном дебиане такого нет. В убунте да, такое бесило.

Так новая версия XFCE вышла Dec 15 2022.

миф, что пользователи хотят именно так. Они хотят хорошо структурированную информацию

Делали приложение, так главная страница занимает, наверное, экранов двадцать - приходится скроллить. Пользователей переубедить не удалось, им привычен такой порядок элементов и чтобы всё находилось в одном месте. Только добавили сбоку быструю навигацию, но ей не пользуются.

Извиняюсь за оффтоп. Пример кода:

int Letter(unsigned char ch) {
    if (isalnum(ch) == 1 || isalnum(ch) == 2) return 1;
    if (ch >= 192 && ch <= 255) return 1;
    return 0;
}

warning: V560 A part of conditional expression is always true: ch <= 255. The value range of unsigned char type: [0, 255].

Отлично, один варнинг есть. Но есть ещё претензии к коду, который можно отловить автоматически:

  • повторный вызов isalnum в этом же выражении - микрооптимизация: вынести вызов перед сравнением

  • isalnum возвращает 0 или НЕ ноль, то есть сравнение == 2== 1) некорректно. Правильно == 0 или != 0 Незамеченное UB?

В расте так и сделано, переменные по умолчанию не мутабельные, хочешь изменить переменную - укажи модификатор mut.

У нас в организации как-то временно запрещали закупать компьютеры. Окай, подумали мы, и в следующей закупке было закуплено:

  • компьютерный корпус с блоком питания мин ХХХ ватт и usb3 на передней панели * 12 штук

  • материнская плата, сокет такой-то с M2 * 12 штук

  • процессор Ryzen 5 (?) столько-то ядер * 6 штук

  • процессор Ryzen 3 (?) столько-то ядер * 6 штук

  • кулеры мин ХХХ ватт

  • оперативная память DDR4 комплект 16*2 ГБ минимальная частота ХХХХ ГГц * 10 штук

  • оперативная память DDR4 комплект 8*2 ГБ или 16 ГБ * 6 штук

  • оперативная память DDR3 комплект 8*2 ГБ или 16 ГБ * 10 штук

  • SSD M2 NVME 512 ГБ * 6 штук

  • SSD M2 NVME 256 ГБ * 10 штук

  • SSD sata 256 ГБ * 10 штук

  • SSD sata 512 ГБ * 5 штук

Потом всё это совершенно внезапно собралось в новые компьютеры, лишнее из заказа пошло на апгрейды существующих. Года через два на системниках появились инвентарные номера. Как это оформили в бухгалтерии - не знаю

Любой лазерный принтер и даже простая фотобумага легко позволит печать с плотностью пикселей 1200 dpi. Теперь сравните с экранами тех же смартфонов.

Это несравнимые категории: самостоятельное изготовление книги и домашняя печать на лазерном принтере. Заказывал в типографии книгу на 700+ ч/б страниц в твёрдом цветном переплёте, размер А5. У типографии стоит готовая машина, которая печатает с двух сторон на стандартной 80 г/м2 офисной бумаге А4, финишер складывает тетрадки с сразу же сшивает блок книги. Человеку остаётся только приклеить обложку (+500 рублей). Книга обошлась где-то в 2700 рублей за каждый экземпляр.

Что там за глобальная переменная _isWithFracture?

Либо две функции делать:

public double ParseLengthValue(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
    int tmp = ((((a & 0b01111111) << 16) | (b << 8) | c) & 0b011111111111111111111111);
    if (negativeSign)
    {
        tmp = (~tmp) & 0b011111111111111111111111;
    }
    val = tmp / 64.0;
    return negativeSign ? -val : val;
}

public double ParseLengthValueWithFracturee(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
    int intPart = 0;
    double fracPart = 0;
    //val = intPart + fracPart;
    if (negativeSign)
    {
        intPart = ((~a & 0b01111111) << 10) | ((~b & 0b11111111) << 2) | ((~c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
        fracPart = 1 - fracPart;
    }
    else
    {
        intPart = ((a & 0b01111111) << 10) | ((b & 0b11111111) << 2) | ((c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
    }
    val = intPart + fracPart;
    return negativeSign ? -val : val;
}

Либо условную компиляцию:

public double ParseLengthValue(byte a, byte b, byte c)
{
    double val;
    bool negativeSign = (a & 0b10000000) > 0;
#ifdef IS_FRACTURE
    int intPart = 0;
    double fracPart = 0;
    //val = intPart + fracPart;
    if (negativeSign)
    {
        intPart = ((~a & 0b01111111) << 10) | ((~b & 0b11111111) << 2) | ((~c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
        fracPart = 1 - fracPart;
    }
    else
    {
        intPart = ((a & 0b01111111) << 10) | ((b & 0b11111111) << 2) | ((c & 0b11000000) >> 2);
        fracPart = (c & 0b00111111) / (double)0b00111111;
    }
    val = intPart + fracPart;
#else
    int tmp = ((((a & 0b01111111) << 16) | (b << 8) | c) & 0b011111111111111111111111);
    if (negativeSign)
    {
        tmp = (~tmp) & 0b011111111111111111111111;
    }
    val = tmp / 64.0;
#endif
    return negativeSign ? -val : val;
}

Тогда так:

trait Hello: std::fmt::Display {
    fn hello(&self) {
        println!("meow: {self}");
    }
}

impl Hello for i32 {}

fn main() {
    let i = 42;
    i.hello();
}

"git add ." - это вообще за гранью зла, особенно если есть специально не добавленные в коммит файлы.

Сразу видно в по сигнатуре функции, что значение возвращается через аргумент или иным способом функция модифицирует передаваемое значение. Плюс компилятору должно быть больше информации для оптимизаций.

let mut buf_rx: [MaybeUninit<u8>; 2048] = …;
let size = socket.recv(&mut buf_rx).unwrap();

с++ же не умеет в возвратный полиморфизм, или нет?

Выше про примитивы рассказали, но не показали. А ваш с++ может так?

trait Hello {
    fn hello(&self);
}

impl Hello for i32 {
    fn hello(&self) {
        if *self == 42 {
            println!("число {self} = 42");
        } else {
            println!("число {self} != 42");
        }
    }
}

fn main() {
    let i = 42;
    i.hello();
}

Да, накладываются большие ограничения на реализацию трейтов (типажей), реализация может быть написана только для своего трейта или для своего типа, но нельзя взять одновременно чужой трейт и чужой тип - не скопилируется. Раньше, вроде, обходилось путём typedef - и у тебя на руках якобы свой тип.

Извините, а где можно скачать старую версию приложения (например, 5.39 LTS для старой архитектуры процессора)? Раньше была ссылка вида repo.2gis.ru.

В двоичном интерфейсе приложений (ABI) x64 по умолчанию используется четырехрегистровое соглашение о вызове, т. н. x64 calling convention

Могу ошибаться, но это справедливо только для windows. В linux x86_64 ABI передаёт через регистры 8 целочисленных аргументов (остальные через стек).

Иногда в changelog'ах и такое встречается: мы пофиксили падение программы под windows, но на всякий случай пересобрали программу и под linux с новой версией, обновляйтесь.

Кстати, да. Например, сервер будет выдавать файл/строку с лицензией, которая подписана криптографической подписью. Приложение проверяет подпись вшитым публичным ключом и подтверждает факт покупки. От клонирования лицензии на другое устройство не спасёт.

Iceman. Friendship is Optimal.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность