Название: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 16:29 Начну с предыстории, есть прога, которая расчитана на работу под Windows, Linux, и MacOS платформами. Вроде как работала хорошо, но под виндой 64-битной иногда вылетала, я где то прочел что это может быть из за использования типа int в циклах, мол лучше использовать size_t. Прочитано, сделано, в проге поменял int на size_t. Под виндой и под линуксом собралось все хорошо, а вот под маком как то не очено, в тех местах где ф-ция должна принимать тип int ,а ей приходят size_t, валятся ошибки компилятора.
Стало быть возникает два вопроса: 1. Почему такого не происходит на других платформах, почему там компилятор все преобразует сам? 2. Что можно сделать что бы код руками опять весь не просматривать и не писать что то типа (int)size_t ? Название: Re: MacOS и size_t Отправлено: Пантер от Май 04, 2011, 16:34 Хоть бы ошибки привел.
Название: Re: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 16:39 да, извиняюсь, скрин в аттаче
Название: Re: MacOS и size_t Отправлено: Пантер от Май 04, 2011, 16:46 У меня в Линухе тоже не собирается. Это из-за того, что size_t кастится как в int, так и в uint, и компилятор не может найти верный каст.
Код
Название: Re: MacOS и size_t Отправлено: GreatSnake от Май 04, 2011, 16:59 А зачем здесь вообще size_t коли int QString::count() ???
Цитировать я где то прочел что это может быть из за использования типа int в циклах, мол лучше использовать size_t На заборах знаете тоже хрень всякую пишут. Это что это у вас за циклы коли int-а не хватает ???Название: Re: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 17:01 призабавнейшая забава :) у меня под линухом собирается и под Ubuntu и Open SUSE и даже Fedora :) версия gcc 4.4.5. Ладно приду домой поразбираюсь
Название: Re: MacOS и size_t Отправлено: Авварон от Май 04, 2011, 17:04 size_t не нужен в программах, использующих Qt
То, что вы прочитали, верно для std, тк там std::string::size возвращает size_t: Пример, есть строка, длиной ну скажем 0x0000 0000 ffff ffff - размер даже влазит в инт, только это число как сайз_т 2^32-1, а при касте к инту будет -1. А -1 != 2^32 На Qt это произойти не может, тк все ф-ии возвращают int (ну и да, уникодовская строка длиной 2^64 тупо не влезет в память, поэтому сайз_т бесполезен по своей сути). Название: Re: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 17:52 хм... спасибо, из size_t в int назад переписать будет легче :)
Название: Re: MacOS и size_t Отправлено: zenden от Май 04, 2011, 18:10 Так всё-таки.. какой тип переменной использовать в качестве счетчика цикла? Так, чтобы компилировалось везде, не вылетало и предупреждения не валились.
А то VC++ задолбал своими предупреждениями (warning C4018: '<' : signed/unsigned mismatch) Название: Re: MacOS и size_t Отправлено: Авварон от Май 04, 2011, 18:15 Я же написал - зависит от типа переменных
Сравните Код: int QString::size() const; Код: size_t std::string::size() const; Название: Re: MacOS и size_t Отправлено: zenden от Май 04, 2011, 18:48 С size_t есть проблема. Безобидное, казалось бы, изменение в коде
for(size_t i = 0; i< v.size(); i++) for(size_t i = 0; i< v.size()-1; i++) приводит к печальным последствиям... Название: Re: MacOS и size_t Отправлено: Igors от Май 04, 2011, 19:13 for(size_t i = 0; i< v.size()-1; i++) Ну или такприводит к печальным последствиям... Код :) Название: Re: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 21:04 а какие последствия, если не секрет? Что то я не могу сообразить :)
Название: Re: MacOS и size_t Отправлено: LisandreL от Май 04, 2011, 21:10 Код
Отличный код. ;D а какие последствия, если не секрет? Если v.size()==0, то v.size()-1 == 0xFFFFFFFF (ну или другое кол-во F в зависимости от платформы). Ну а дальше index out of range.Название: Re: MacOS и size_t Отправлено: ecspertiza от Май 04, 2011, 21:13 спасибо, начал с одного, узнал про другое ))))
Название: Re: MacOS и size_t Отправлено: gogi от Май 05, 2011, 10:12 да, извиняюсь, скрин в аттаче У тебя параметр str на стеке создаётся при вызове функции, а потом ты возвращаешь static QString. Что-то здесь не то. Название: Re: MacOS и size_t Отправлено: gogi от Май 05, 2011, 10:17 С size_t есть проблема. Безобидное, казалось бы, изменение в коде for(size_t i = 0; i< v.size(); i++) for(size_t i = 0; i< v.size()-1; i++) приводит к печальным последствиям... Вычитание уже само по себе намекает на знаковый тип, об этом даже могут сообщать шибко настроенные на варнинги компиляторы/анализаторы. Поэтому size_t заменить на ssize_t. Ну или если не хочется с нестандартность связываться - на int. Название: Re: MacOS и size_t Отправлено: GreatSnake от Май 05, 2011, 10:20 Цитировать У тебя параметр str на стеке создаётся при вызове функции, а потом ты возвращаешь static QString. Что-то здесь не то. Он возвращает копию str. А 'static' относится к 'видимости' функции, а не к её возвращаемому значению.Другое дело, что аргумент по-хорошему должен быть 'const QString&'. Название: Re: MacOS и size_t Отправлено: Пантер от Май 05, 2011, 10:26 Другое дело, что аргумент по-хорошему должен быть 'const QString&'. Это почему же? Тогда бы пришлось вводить свою переменную внутри функции.Название: Re: MacOS и size_t Отправлено: Пантер от Май 05, 2011, 10:28 Если уж на то пошло, то правильнее будет:
Код
:) Название: Re: MacOS и size_t Отправлено: GreatSnake от Май 05, 2011, 10:32 Цитировать Это почему же? Тогда бы пришлось вводить свою переменную внутри функции. Ну да, зато прототип красивый будет, как у троллей :)Название: Re: MacOS и size_t Отправлено: LisandreL от Май 05, 2011, 13:25 Вычитание уже само по себе намекает на знаковый тип, об этом даже могут сообщать шибко настроенные на варнинги компиляторы/анализаторы. Поэтому size_t заменить на ssize_t. ptrdiff_t вполне стандартный знаковый, совпадающий по разрядности с размером указателя (как и size_t).Но вообще, как и писал Авварон, раз QString индексируется int'ом, то и цикл лучше делать по нему. Название: Re: MacOS и size_t Отправлено: Авварон от Май 05, 2011, 14:44 Свои 2 копейки внесу.
Код: static QString invertSlash (const QString &str) Название: Re: MacOS и size_t Отправлено: Пантер от Май 05, 2011, 18:16 Авварон, по сравнению с моим вариантом профита никакого.
Название: Re: MacOS и size_t Отправлено: Авварон от Май 05, 2011, 19:24 Кодестайлинг и фсе дела
|