Russian Qt Forum
Июнь 23, 2024, 07:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 [3] 4 5 ... 217
31  Qt / Вопросы новичков / Re: Как из модели списка испустить сигнал? : Май 25, 2021, 12:17
сигнал - неконстантная функция (внутри нее объест можно поменять через его АПИ), ее нельзя вызывать из константной (которая как бы говорит, что объект не меняется, пока мы в функции).

вообще, это плохой дизайн, так как data() должна работать очень быстро (и за O(1) от размера данных) так как она вызывается часто и много.
32  Программирование / Общий / Re: Провайдеры : Май 17, 2021, 17:54
Апну темку Улыбающийся

Сейчас я пытаюсь решить проблему совместимости со старым кодом.

Как провайдеры работают сейчас - если Qbs не может найти модуль, скажем, Qt.core, она идет и ищет провайдер "Qt.core", если такого нет, то ищет "Qt", который и создает утешные модули. Таким образом, если проект не зависит от Qt.core, то провайдер не вызывается.

Теперь, мы делаем новое свойство qbsModuleProviders: ["Qt", "conan", "pkgconfig"], которое задает порядок, в котором выполняются провайдеры. Сначала работает "Qt", который создает модули для Qt, потом "conan", потом "pkgconfig". Бонусом имеем то, что разные провайдеры могут создавать одноименные модули, но приоритет имеют те, которые раньше в списке - например, если и "conan", и "pkgconfig" предоставляют модуль "zlib", то будет использован от "conan" - очень удобно делать механизм фоллбека между провайдерами.

Также теперь необязательно выполнять провайдеры, когда модуль не найден, можно выполнить весь список ДО поиска модулей - это упростит код в Qbs.
Однако появляется проблема - как быть с дефолтами? Если сделать значение qbsModuleProviders по умолчанию пустым, то сломается автопоиск Qt и pkgconfig. Правда во втором всё равно ничего нет, так что и не проблема=) но вот с Qt это проблема.
Какие варианты есть?
1а. Если qbsModuleProviders пустой, то можно попробовать выполнить ВСЕ провайдеры, которые есть. Это плохо, так как это ужасно медленно (сетап Qt где-то полсекунды, pkg-config 4 секунды чтобы сгенерить все возможные модули, но тут можно оптимизировать).
1б. То же, что 1а, но провайдер говорит, надо ли его звать по дефолту (enabledByDefault: true). Это позволит выключить особо тяжелые провайдеры, но остается проблема - если проект не зависит от Qt, а у Qt провайдера enabledByDefault: true, то юзеру будет непонятно, почему мы пытаемся сетапить Qt
1в. То же, что 1б, но enabledByDefault вычисляется, скажем, по наличию qmake в PATH. Проблему особо не решает, но если проверять, задано ли свойство провайдера qmakeSearchPaths (оно задаётся при запуске qbs setup-qt), то это решит совместимость при использовании Qt-профиля - если юзер явно указал Qt профиль, то наверное он хочет Qt. Но это не решит проблему при автодетекте qmake в PATH - независимо от наличия qmake в PATH мы не знаем заранее, нужна ли юзеру Qt.
2. Ничего не делать и заставить юзера указывать qbsModuleProviders руками в проекте:
Код:
QtApplication {
    Properties {
         condition: qbs.version >= 1.21
         qbsModuleProviders: ["Qt", "conan", "pkgconfig"]
    }
}
Ломается поведение по умолчанию, но можно пока оставить старые реализации провайдеров Qt и pkg-config и при попытке их использовать, выдавать warning - мол, deprecated, задавай qbsModuleProviders явно.
В целом, явное задавание имеет смысл, потому что провайдеры могут создавать не только плюсовые/кутешные модули и, скажем, делать там ["pkgconfig"] по дефолту для Java или там Typescript проекта не имеет смысл.

Какие мысли?
33  Программирование / С/C++ / Re: Layout groupBox : Май 12, 2021, 16:40
Работаете в дизайнере? Если да, то надо не виджеты объединять в лайаут (точнее это тоже можно но для другого), а жамкнуть правой кнопкой по родительскому виджету (форме) и задать лайаут ей. Или кнопкой на тулбар воспользоваться выделив оный виджет
34  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Май 10, 2021, 11:16
Может быть. Но гонять (большие) структуры сырые<->рабочие - мало не покажется, считаю оно того стоит.


Это называется "абстракция". Завтра вам надо другой формат поддерживать - удачи менять все структуры.
На самом деле такие "битовые" операции даже в моей текущей области (спутники) нужны (правда тут тупо кодом все читается, без декларативных структур) и вот у вас условно 10 похожих но разных форматов расположения битовых полей. Условно идет Хедер1 по которому мы понимаем идет ли дальше Хедер2А или Хедер2Б. В итоге всё это льется в огромный объект с кучей свойств - в зависимости от какие-то свойства есть, каких-то нет. Причем одни и те же свойства в разных вариантах на разной битовой позиции, ох я бы не хотел работать с битовыми структурами напрямую
35  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 27, 2021, 13:15

Это не то, чтобы "в с/с++ это предусмотрено и так нужно делать", это безопасный лайфхак. Если размер битовой структры 64 бита, и объединённого члена 64 бита, то компилятор не то что не позволит это сделать, или что-то испортит - а куда он денется с подводной лодки?

все ненавистное UB нужно для оптимизаций.
Можно тот пример с reinterpret_cast переписать на union:

Код:
union U {
    int i{0};
    float f{0};
};

int foo()
{
        U u;
u.i = -1;
u.f = 0.0f;

return u.i; // 0 или -1?
}
36  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 27, 2021, 12:49
Писать в одно поле юниона, а читать из другово (в моих примерах) законно в любом языке. То, о чем говориться по вашей ссылке к моему случаю не имеет отношения.

Нет, не законно=) Это опять возвращает нас к разговору о reinterpret_cast и type punning.
Единственный законный способ сделать type punning в современном с++ - это memcpy.
В с++20 добавят bit_cast который сейчас можно написать самому через memcpy

Код:
template <class To, class From>
typename std::enable_if_t<
    sizeof(To) == sizeof(From) &&
    std::is_trivially_copyable_v<From> &&
    std::is_trivially_copyable_v<To>,
    To>
// constexpr support needs compiler magic
bit_cast(const From& src) noexcept
{
    static_assert(std::is_trivially_constructible_v<To>,
        "This implementation additionally requires destination type to be trivially constructible");
 
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

То есть можно скопировать буфер в структуру через memcpy а вот записать int64_t а потом прочитать из битфилда на него наложеннный - нет.
Но да, все известные мне компиляторы это позволяют делать. Но clang-tidy ругается AFAIK
37  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 11:26
с 50% вероятностью ответ нет
38  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 11:02

So ?

Код:
void doWork(const CData &data)
{
}

template<typename С>
void iterateContainer(const С& c)
{
    for (const auto &item: c)
    {
        if constexpr (std::is_pointer_v<C::value_type>)
            doWork(*item);
        else
            doWork(item);
    }
}
39  Программирование / С/C++ / Re: Итераторы : Апрель 22, 2021, 10:55
Если в b() генерируется исключение, то в потоке должен остаться результат от a(). А теперь посмотрите что кодогенерит gcc до 7. Улыбающийся

Ну да, но это с с++11, на тот момент задача была валидная. Я таки носили простыню про sequencing, пункт 19 https://en.cppreference.com/w/cpp/language/eval_order
Но надо понимать что это поправили только для operator<< и >>, для operator+ порядок по-прежнему не задан.
40  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:11
у вас в обоих случаях 10.3 (см правый pane)
41  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 17:00
Даже в вашем варианте порядок вызовов четко определен. Улыбающийся

Ну вот gcc 4.6 печатает "210", а 10.3 печатает "120" https://godbolt.org/z/Pc9fa4bf9
Там в целом были какие-то изменения в с++11, но яхз, поправлено это или "везет" что все новые компиляторы печатают одинаково.

Что вначале выполниться boo или f? Улыбающийся

вот только оператор (даже член класса) это функция от двух аргументов
Код:
foo(f(), g());
не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано?
42  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 15:15

Нужно было вспомнить, что эта запись сахар для такой Улыбающийся
Код
C++ (Qt)
std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
 


Да, но нет, это не члены класса а свободные функции:

Код
C++ (Qt)
operator<<(operator<<(operator<<(operator<<( std::cout, f() ), f() ),  f() ), std::endl );
 
и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
43  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 12:03
Любая задача имеет по меньшей мере одно решение: снятие самой задачи/проблемы. Здесь оно и будет лучшим - не нужны такие заморочки.

Ну там задачи были разной сложности что позволяло оценить уровень кандидата. Полезно иметь задачу с подвохом ультимативной сложности. Если человек скажет какой-то один из возможных вариантов, то норм (там еще надо продраться сквозь код же), а если про точки следования вспомнит - ваще бох. Правда на моей памяти никто без подсказок не вспомнил, но это и не особо влияло.
44  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 11:52
И как вы предполагали - какой Rand будет вызван первым - левый или правый?

В 2ГИСе мы спрашивали похожую задачку
std::cout << f() << f() << f() << std::endl;

где f() имеет сайд-эффект (делает i++)

никто не решил (я в том числе)
45  Программирование / С/C++ / Re: Итераторы : Апрель 21, 2021, 11:47
Вот этот код дает UB (печатает -1 вместо ожидаемого 0) в обоих случаях (MinGW 8.3, O2):

Да, прикольно, не задумывался о том что placement new можно звать на unrelated типах.
Небось тоже где-то прописано что так делать нельзя (кроме char*/void*)
Страниц: 1 2 [3] 4 5 ... 217

Страница сгенерирована за 0.091 секунд. Запросов: 23.