LINUX.ORG.RU

QT — размеры в int  — что за бред оО? Или я чего то не понимаю?

 , , ,


0

1

тут копался в чужом коде — куча несостыковок по типам — то беззнаковый в знавковый переводится, то обратно...

проект на QT, ходил много раз в либы ентого фреймворка и смарел, как в нем размеры хранятся в int...

но внимание вопрос — как размер может быть отрицательным?
зачем тогда использовать знаковый тип, если можно использовать беззнаковый?

★★

Последнее исправление: safocl (всего исправлений: 1)

Тоже подметил. Может чтобы пользователь не смешал случайно знаковый и беззнаковый тип с печальными последствиями.

andalevor ★★
()
Ответ на: комментарий от DELIRIUM

В Qt у встроенного вектора и других контейнеров тип размера int.

https://doc.qt.io/QT-5/qvector.html#size

https://doc.qt.io/QT-5/qvector.html#operator-5b-5d

safocl

Всё норм, Qt копировали Java когда создавались, там тоже int в размерах у контейнеров.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Там много где int торчит. Например в QTextCursor selectionStart и selectionEnd возвращают int, хотя по смыслу там отрицательных значений быть не может, на сколько я понял.

andalevor ★★
()
Ответ на: комментарий от andalevor

так как раз то када у тебя размер чего либо может быть отрицательным — то смешиваются они...

safocl ★★
() автор топика
Ответ на: комментарий от andalevor

хотя по смыслу там отрицательных значений быть не может

так в том то и дело, а зачем тогда, если беззнаковый тип экономичнее к памяти, а в данном случае знак не нужен... т.е. половина значений не используется?

safocl ★★
() автор топика

ну и про проект где много неявных кастов, и даже как по мне просто ужасных, — а так же сравнения через == и != чисел с плавающей точкой — енто мой любимый QmPlay2

он собирается с 11 стандартом — я же хачу чо бы он норм собирался с -Wall -Wextra -Werror -std=c++17

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

или размер умножается на что-то отрицательное, то будет ой. а зачем в джаве так сделали?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от fsb4000

копировали Java когда создавались, там тоже int в размерах у контейнеров.

А что, может быть по другому? :)

EXL ★★★★★
()
Ответ на: комментарий от DELIRIUM

Я к тому, что в Java нет unsigned-типов в целях упрощения.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

Qt - 1991 год, Java - 1995 год.

И?

в Qt1 и были и size и индексы unsigned. Поищи доки.

\fn type &QArray::at( uint index ) const
Returns a reference to the element at position \e index in the array.

Потом появилась Java и Qt пошли копировать Java, откуда и int и итераторы как в Java.

while(it.hasNext()) {
    if (it.next() == "Библиотека Qt") {
       it.setValue("Профессиональное программирование на С++");
       }
    qDebug() << it.peekPrevious();
}
fsb4000 ★★★★★
()

пишешь везде int и не думаешь ни о чём
а когда смесь знаковых и беззнаковых — тут думать надо
а лучше не думать

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)

В опенжоеле то же самое. Притом в более новых функциях апи уже используют unsigned(long), что как бы намекает.

anonymous
()
Ответ на: комментарий от Bad_ptr

а лучше не думать

Скорее всего именно потому. Чтоб результат какого-нибудь ‘index < count - 1’ не удивлял новичков.

anonymous
()
Ответ на: комментарий от anonymous

экономичнее к памяти

Купи память, нищеброд!
Экономить надо человеческую память, а не компьютерную.

Притом в более новых функциях апи уже используют unsigned(long), что как бы намекает.

Это заговор яйцеголовых, чтобы комитеты создавались и финансировались. Они же пропихнули во всюда C++ вместо Delphi, чтобы потом на C++ переизобрести Delphi в виде Qt

Bad_ptr ★★★★★
()

Я почти уверен, что они так сделали, чтобы явно -1 возвращать из size().

ЗЫ sizeof(int32_t) == sizeof(uint32_t).

anonymous
()

Есть один плюс использования знаковых типов для размеров и индексов: когда надо проиндексировать что-то с конца в начало:

for (int i = container.size(); i >= 0; --i) {
  container[i];
}

Для unsigned доводится городить извращения вроди:

for (size_t i = container.size() - 1; i < container.size(); ++i) {
  container[i];
}

или так:

for (size_t i = container.size(); i > 0; --i) {
  container[i - 1];
}

Или использовать итераторы

KennyMinigun ★★★★★
()

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

xaizek ★★★★★
()
Ответ на: комментарий от KennyMinigun

или так:

for (size_t i = container.size(); i-- > 0;) {
  container[i];
}

и твои волосы будут мягкими и шелковистыми

anonymous
()
Ответ на: комментарий от safocl

Ну выглядит как действительно пару базовых контейнеров стащили у джавы, а потом поехало, пришлось везде инты тащить.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

ну как бы больше значений вмещает?

safocl ★★
() автор топика
Ответ на: комментарий от EXL

Они знают, а вот программисты на Qt могут и не знать.

peregrine ★★★★★
()
Ответ на: комментарий от Bad_ptr

ну так как раз получается када знаковыми типами помечаются размеры, то наоборот надо думать, что бы не сделать их отрицательными...

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

каких например? пока лень посмотреть какие варнинги в силанге и гсиси включают енти опции...

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

ЗЫ sizeof(int32_t) == sizeof(uint32_t).

ага, вот только что бы достичь макс значения uint32 — надо использовать уже не int32, а int64.

safocl ★★
() автор топика
Ответ на: комментарий от KennyMinigun

так можно жеж использовать итераторы

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от anonymous

ну короче вывод следующий — если пишиш на QT то надо везде использовать знаковые типы, верно?

safocl ★★
() автор топика

Производить вычисления лучше, используя знаковые типы, а битовые операции можно делать только с беззнаковыми (иначе получишь undefined behavior). Довольно часто в существующем C++ коде этим моментам внимание не уделяется вообще: двигают биты в int, мешают unsigned и int в вычислениях, короче полный треш и угар.
Есть мнение, что по возможности везде следует использовать знаковые типы и size_t в STL контейнерах - досадное недоразумение.
Лично я стараюсь везде использовать signed типы и просто преобразую unsigned в signed и наоборот там, где это необходимо. Интересный момент, как именно делать это преобразование. Простой static_cast тупо замаскирует проблему, поэтом я пользуюсь самописным narrow_cast, который бросает исключение в случае, если значение не может быть преобразовано в заданный тип. Можешь нагуглить реализацию narrow_cast (я находил несколько вариантов) или написать сам. Обычно отличия в том, дергается ли внутри assert или бросается исключение.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)

И никто не упомянул, что QT≠qt. ТС, пожалуйста, не пиши так

boowai ★★★★
()

С некоторого времени человечество осознало (есть учебники по C++ от 94-го года, где это уже пропагандируется), что беззнаковые типы это зло и реально необходимость в них была только во времена 16-битных int-ов.

anonymous
()
Ответ на: комментарий от safocl

Вывод следующий: C++ - говно, STL придумал идиот. Qt - попытка сделать из говна приемлемый инструмент.

anonymous
()

Самое идиотское, что он не только знаковый, но и 32 битный на распространённых платформах, что делает контейнеры из qt в принципе неюзабельными

CatsCantFly
()
Ответ на: комментарий от CatsCantFly

https://youtu.be/Puio5dly9N8?t=774 Тут тоже макаки из мира жабоскрипта собрались?

Для Ъ: некий Bjarne Stroustrup советует «Use ints until you have a reason not to. Don’t use unsigned unless you are fiddling with bit patterns, and never mix signed and unsigned».

NeXTSTEP ★★
()
Последнее исправление: NeXTSTEP (всего исправлений: 1)

Тред не читал, код не смотрел. Может быть используют знаковые значения что бы использовать отрицательный диапазон для ошибок?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от CatsCantFly

но и 32 битный на распространённых платформах, что делает контейнеры из qt в принципе неюзабельными

Тебе мало 32 бита чтобы хранить размеры элементов гуя?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от anonymous

что беззнаковые типы это зло и реально необходимость в них была только во времена 16-битных int-ов.

Ты с дуба рухнул? Какое зло?! Если тебе три инта хранить то да, если у тебя эдак пару миллионов структур в памяти, уж изволь. А если ещё и записывать надо в фалы то ваще окстись!

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А если ещё и записывать надо в фалы то ваще окстись!

https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html

off_t shall be signed integer type

anonymous
()
Ответ на: комментарий от anonymous

Я имел в виду запись больших блоков данных, если есть число которое помещается в uint16_t, но не помещается в int16_t логично хранить его в uint16_t, а не в uint32_t. Я вот про это. Знаковые нужны и удобны, но это не значит что без знака зло.

off_t

смещения, в их смысл заложено что они могут быть отрицательны относительно какого либо положения. Тут всё норм. Знак тут как флаг направления смещения, сложно придумать что-то иное. Тут всё идеально.

LINUX-ORG-RU ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.