Russian Qt Forum
Апреля 19, 2025, 15:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4] 5 6 ... 217
46  Программирование / С/C++ / Re: Итераторы : Апреля 20, 2021, 16:03
Ах, таки вы меня подсекли! Про возможную специализацию внешнего типа я упустил. В данном случае специализации QSet нет, работать будет. Но в общем случае - да, это нужно учитывать.

Там внутри могут быть всякие traits которые для разных типов разные.
Но в любом случае, даже если битовое представление одинаковое, это UB.

По поводу strict alias rule и оптимизации (привет restrict poiners): А как вы соотнесете это с placement new(), например?

В чем проблема-то? Единственный валидный юзкейз reinterpret_cast между разными типами это каст к массиву байт (или void*) и обратно.
Компилятор знает что вон тот char buffer[] потенциально может алиаситься с вот этим указателем и сгенерит менее производительный код.
placement new как раз подпадает под это - буфер чаров может алиаситься (и делает это) с указателем на произвольный T.
А вот любые другие типы (например int* в double*) алиаситься не могут.
47  Программирование / С/C++ / Re: Итераторы : Апреля 20, 2021, 15:09
Ну или более сложный пример, вы знаете что на вашей платформе sizeof(bool) == sizeof(int8_t) (ну или char).
Значит вы можете сделать
Код:
vector<bool> bools;
auto &chars = reinterpret_cast<vector<char>&>(bools);
?
48  Программирование / С/C++ / Re: Итераторы : Апреля 20, 2021, 15:04
Это UB, в общем случае нельзя делать reinterpret_cast между unrelated типами.

https://en.cppreference.com/w/cpp/language/reinterpret_cast

Цитировать
std::pair<int, int> and std::pair<const int, int> are not similar.

Компилятор предполагает что 2 ссылки/указателя на различные типы не могут ссылаться не одну область памяти (strict alias rule) и строит на этом оптимизации.
reinterpret_cast ломает это предположение - если компилятор тупенький и не оптимизирует, то это будет работать, если умный, то сломается. UB.
49  Программирование / С/C++ / Re: Итераторы : Апреля 20, 2021, 12:41

Код:
return reinterpret_cast<QSet<std::reference_wrapper<CData>>&>(mSelection);

Это UB
50  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 16, 2021, 10:44
Бегло глянул исходники на вебе, не вижу что/как там "поломано", ноды создаются с помощью allocateNode, их адреса остаются неизменными. Итераторы - да, уплыть могут, но это было всегда (см erase)


хз куда вы смотрели

https://doc.qt.io/qt-6/qtcore-changes-qt6.html#stability-of-references
51  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 16:46
Непонимающий Так всегда было, неперемещаемость только для erase, для вставок и remove "пионерский привет" (rehash)

хэш (обычно) это массив линкед-листов. при реаллокации массива, внезапно, адреса (и ссылки на элементы) нодов линкед листов не меняются - эту гарантию даёт, например, std::unordered_map.
можно действительно хэш реализовать другими способами, и тогда при раллокации адреса могут поехать, но в qt5 он был старым-добрым массивом линкед-листов и давал гарантию при insert'e (по крайней мере, оно работало на практике)
Но как минимум странно имея имплементацию "по стандарту" менять ее на другую которую захотела левая пятка, поломав кучу кода.
При переходе на qt6 код ломается, и самое простое решение - выкинуть QHash нафиг и использовать std::unordered_map.

Не стоит так "хвост распускать"  Улыбающийся, дойдет до дела (выше) - будет обычная история  Плачущий

Просто ваши задачи требуют неадекватного количества времени чтобы понять вообще в чем задача - требования меняются каждую страницу потому что вы их "забыли" указать, но предложенное решение им (конечно же!) не удовлетворяет.
Цитировать
-я хочу сделать кнопку чтобы приложение закрывлось
-вот кнопка
-мне круглую надо
-окей
-и красную
-окей
-и чтобы шрифт зеленый
-ооок
-и чтобы диалог появлялся
-вот диалог
-да ты просто тупой, вот я взял и написал сразу круглую красную кнопку с зеленым текстом и диалогом а вы все форумом хрень какую-то предлагали. зато в шаблоны умеете!
52  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 16:14
Плиз "ткните носиком" где прочитали, не припомню ни одного контейнера который бы имел неинициализированные эл-ты. Ну разве QVarLengthArray, но там умышленно.

Вздох.
std::vector::reserve ?
53  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 16:14

Дык это я как раз строчку с "букваря" (документации по QHash) взял. Там написано, что "по стандарту" int не обязан нулём инициализироваться, поэтому для хэша они это "сами заимплементировали".

Ну кутешные контейнеры пишут такие же специалисты как те которые в итераторах не могут разобраться=)
В Qt6 например QHash не обеспечивает стабильность ссылок при вставке что ломает тонну кода.
Вы читайте cppreference - там требование к T чтобы он был default-constructible для operator[]. Интересно, зачем надо default-constructible кроме как чтобы позвать T() (подсказка - int a; дефолт ктор не зовет)
54  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 15:53
Почти хорошо, т.к. *But for primitive types like int and double, as well as for pointer types, the C++ language doesn't specify any initialization; in those cases, Qt's containers automatically initialize the value to 0.

Кутешные контейнеры тут ни при чем - если элемента нет, вставляется default-constructed value, что для int'а 0 по стандарту. default-constructed value != uninitialized variable. Но это же букварь читать надо, тонкости языка знать, это не циклы с индексами писать=)

Но только если в хэше уже раньше был 0-й ключ, то он превратится в 100, а не в 1... Понимаю, что пошла уже софистика, но возможно "джун" был не совсем туп Улыбающийся

Ну это действительно софистика, потому что исходный код считал с нуля но зачем-то делал 3 лукапа.
55  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 15:23
Эт верно, но только если гарантируется, что для default-constructed T будет 0 Улыбающийся
А если нет - хм, возможен ведь и такой варинт...
Или же мы хотим не 0 по дефолту, а там 100 например?


придется почитать букварь и выяснить что operator[] таки возвращает ссылку
Код:
int &value = hash[key];
if (value == 0)
    value = 100;
else
    value++;
56  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 14:40

Один поиск все равно лишний... Улыбающийся

ну вообще это просто

Код:
hash[key]++;

но это уже надо знать про то что operator[] создает default-constructed T - это же не циклы с индексами писать, это справочники читать надо
57  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 14:37
Не надо перегибать палку.

Я не перегибаю, практика показывает, что люди, не знающие итераторов также не знают что operator[] возвращает ссылку (которую можно менять) или что такое explicit.
58  Программирование / С/C++ / Re: Compile-time определение реверсивности итератора (reverse_iterator) : Апреля 15, 2021, 13:14
ИМХО один из лучших принципов разработки, которого придерживаются мастера - это пресловутый KISS.

а потом я вычищаю из кода такое

Код:
if (!hash.contains(key)) {
    hash.insert(key, 0);
}
hash[key]++;
59  Разное / Говорилка / Re: Геометрия (задачки) : Апреля 06, 2021, 14:29
В треугольник вписано 3 квадрата площадями 4,36,9. Найти площадь треугольника. Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.

Ну не очень ясно, мне кажется я все равно пользуюсь подобием.
Можно достроить аналогичный треугольник, скажем, справа, получим параллелограмм.
Дальше можно заметить, что если перекинуть "правый" кусок (треугольник) параллелогамма налево, то получим прямоугольник размера вдвое больше исходного треугольника.
А дальше вопрос, чем можно пользоваться - то есть как вычислить высоту и ширину.
С высотой просто - это 6 + 4 (высота левого большого треугольника).
С шириной хуже - надо понять что правые треугольники равнобедренные, а значит ширина правого куска тоже 3. Слева надо учесть что катеты относятся как 2 к 1 (но это же подобие?) и что ширина левого кусочка - 1.
Итого (6 + 4) * (1 + 2 + 6 + 3 + 3) / 2 = 75

upd: игнорируйте, фигню написал
60  Qt / Работа с сетью / Re: QNetworkAccessManager: не работает после первой ошибки : Марта 31, 2021, 11:43
О, я много на этом боли прочувствовал. До сих пор не пофиксили?
Страниц: 1 2 3 [4] 5 6 ... 217

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