Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: ecspertiza от Май 04, 2011, 16:29



Название: 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, и компилятор не может найти верный каст.
Код
C++ (Qt)
if (str.at (i) == '/') {
 str [static_cast <int> (i)] = '\\';
}
 


Название: 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++)

приводит к печальным последствиям...
Ну или так
Код
C++ (Qt)
for (size_t i = numObjects; i >= 0; --i)
 
:)



Название: Re: MacOS и size_t
Отправлено: ecspertiza от Май 04, 2011, 21:04
а какие последствия, если не секрет? Что то я не могу сообразить :)


Название: Re: MacOS и size_t
Отправлено: LisandreL от Май 04, 2011, 21:10
Код
C++ (Qt)
for (size_t i = numObjects; i >= 0; --i)
 
i >= 0 для беззнакового целого (http://en.wikipedia.org/wiki/Size_t).
Отличный код. ;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
Если уж на то пошло, то правильнее будет:
Код
C++ (Qt)
static QString invertSlash (QString str)
{
 return str.replace ("/", "\\");
}
 

:)


Название: 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)
{
  return QString(str).replace("/", "\\");
}


Название: Re: MacOS и size_t
Отправлено: Пантер от Май 05, 2011, 18:16
Авварон, по сравнению с моим вариантом профита никакого.


Название: Re: MacOS и size_t
Отправлено: Авварон от Май 05, 2011, 19:24
Кодестайлинг и фсе дела