Russian Qt Forum
Ноябрь 24, 2024, 11:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: MacOS и size_t  (Прочитано 11257 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Май 04, 2011, 16:29 »

Начну с предыстории, есть прога, которая расчитана на работу под Windows, Linux, и MacOS платформами. Вроде как работала хорошо, но под виндой 64-битной иногда вылетала, я где то прочел что это может быть из за использования типа int в циклах, мол лучше использовать size_t.  Прочитано, сделано, в проге поменял int на size_t. Под виндой и под линуксом собралось все хорошо, а вот под маком как то не очено, в тех местах где ф-ция должна принимать тип int ,а ей приходят size_t, валятся ошибки компилятора.

Стало быть возникает два вопроса:
1. Почему такого не происходит на других платформах, почему там компилятор все преобразует сам?
2. Что можно сделать что бы код руками опять весь не просматривать и не писать что то типа (int)size_t ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 04, 2011, 16:34 »

Хоть бы ошибки привел.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Май 04, 2011, 16:39 »

да, извиняюсь, скрин в аттаче
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 04, 2011, 16:46 »

У меня в Линухе тоже не собирается. Это из-за того, что size_t кастится как в int, так и в uint, и компилятор не может найти верный каст.
Код
C++ (Qt)
if (str.at (i) == '/') {
 str [static_cast <int> (i)] = '\\';
}
 
« Последнее редактирование: Май 04, 2011, 16:49 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 04, 2011, 16:59 »

А зачем здесь вообще size_t коли int QString::count()  Непонимающий

Цитировать
я где то прочел что это может быть из за использования типа int в циклах, мол лучше использовать size_t
На заборах знаете тоже хрень всякую пишут. Это что это у вас за циклы коли int-а не хватает  Непонимающий
« Последнее редактирование: Май 04, 2011, 17:01 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Май 04, 2011, 17:01 »

призабавнейшая забава Улыбающийся у меня под линухом собирается и под Ubuntu и Open SUSE и даже Fedora Улыбающийся версия gcc 4.4.5. Ладно приду домой поразбираюсь
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Май 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 тупо не влезет в память, поэтому сайз_т бесполезен по своей сути).
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Май 04, 2011, 17:52 »

хм... спасибо, из size_t в int назад переписать будет легче Улыбающийся
Записан
zenden
Гость
« Ответ #8 : Май 04, 2011, 18:10 »

Так всё-таки.. какой тип переменной использовать в качестве счетчика цикла? Так, чтобы компилировалось везде, не вылетало и предупреждения не валились.
А то VC++ задолбал своими предупреждениями (warning C4018: '<' : signed/unsigned mismatch)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Май 04, 2011, 18:15 »

Я же написал - зависит от типа переменных
Сравните
Код:
int QString::size() const;
и
Код:
size_t std::string::size() const;
Записан
zenden
Гость
« Ответ #10 : Май 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++)

приводит к печальным последствиям...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Май 04, 2011, 19:13 »

for(size_t i = 0; i< v.size()-1; i++)

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

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #12 : Май 04, 2011, 21:04 »

а какие последствия, если не секрет? Что то я не могу сообразить Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #13 : Май 04, 2011, 21:10 »

Код
C++ (Qt)
for (size_t i = numObjects; i >= 0; --i)
 
i >= 0 для беззнакового целого.
Отличный код. Смеющийся

а какие последствия, если не секрет?
Если v.size()==0, то v.size()-1 == 0xFFFFFFFF (ну или другое кол-во F в зависимости от платформы). Ну а дальше index out of range.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #14 : Май 04, 2011, 21:13 »

спасибо, начал с одного, узнал про другое ))))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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