Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> comparison between size_t and ptr_diff_t, Как правильно убрать предупреждение 
:(
    Опции темы
Gwendolen
Дата 17.12.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Мне надо преобразовать массив байт в конкретный тип, при необзодимости заменив порядок байт.
Собственно с изменением порядка байт и преобразованием проблемы нет, она возникла при проверке влезет ли в конкретный тип пришедший диапазон байт:

Код

if(sizeof(T) > (last - first))
{
...
} else ...



Где last и first - итераторы .

Получается сравнение знакового ptr_diff_t и беззнакового size_t, на что компилятор, собственно, и ругается:
Код

comparison between signed and unsigned integer expressions


Как правильно исправить код для того чтобы убрать это предупреждение?

Это сообщение отредактировал(а) Gwendolen - 17.12.2011, 14:07
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
boostcoder
Дата 17.12.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Gwendolen @  17.12.2011,  14:02 Найти цитируемый пост)
(last - first)

арифметические операции над указателями/итераторами, дают знаковый тип. sizeof() возвращает беззнаковый.
способ решения - какой-то из операндов привести к типу второго.
PM WWW   Вверх
Gwendolen
Дата 17.12.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Цитата(boostcoder @ 17.12.2011,  14:12)
арифметические операции над указателями/итераторами, дают знаковый тип. sizeof() возвращает беззнаковый.

Об этом я и написал, вопрос в том к какому типу приводить(склоняюсь приводить к знаковому). На всех ли платформах корректно преобразование  size_t к ptr_diff_t?

Это сообщение отредактировал(а) Gwendolen - 17.12.2011, 15:01
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
rumit7
Дата 17.12.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(Gwendolen @ 17.12.2011,  14:02)
Мне надо преобразовать массив байт в конкретный тип, при необзодимости заменив порядок байт.
Собственно с изменением порядка байт и преобразованием проблемы нет, она возникла при проверке влезет ли в конкретный тип пришедший диапазон байт:

Код

if(sizeof(T) > (last - first))
{
...
} else ...



Где last и first - итераторы .

...

Как правильно исправить код для того чтобы убрать это предупреждение?

Может попробовать так?!

Код

if(first + sizeof(T) > last)
{
...
} else ...


PM MAIL   Вверх
Gwendolen
Дата 17.12.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Цитата(rumit7 @ 17.12.2011,  15:23)
Может попробовать так?!

Код

if(first + sizeof(T) > last)
{
...
} else ...


Некрасиво, неочевидно, что именно проверяется.

Я думал про другой вариант:

Код

if((last - first) - static_cast<std::ptrdiff_t>(sizeof(T)) < 0)
{
...
} else ...



Похоже проще просто кастануть тип, ибо размер контейнера никогда не будет соизмерим с размером почти всей доступной памяти, так что можно и не бояться приводить беззнаковый к знаковому(size_t и ptrdiff_t имеют одинаковый размер в байтах):

Код

if((last - first)  < static_cast<std::ptrdiff_t>(sizeof(T)) )
{
...
} else ...


--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
rumit7
Дата 17.12.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(Gwendolen @ 17.12.2011,  16:43)
Цитата(rumit7 @ 17.12.2011,  15:23)
Может попробовать так?!

Код

if(first + sizeof(T) > last)
{
...
} else ...


Некрасиво, неочевидно, что именно проверяется.


Тогда можно так:
Код

template<class T>
bool can_store(iterator begin, iterator end)
{
    return (first + sizeof(T) >= last);
}

// используется так
//
if( can_store<int>(first, last) )
{
    ...
}else{
    ...
}


Конечно на вкус и цвет, как говорится.. но вот со static_cast, код совсем монстрообразный какой-то, хотя может мне так кажется.

Update: Все-таки для данного решения нужно указать, что "iterator" должен относиться к "[U]Random-access iterator category[/U]", так так именно они поддерживают операцию ">=".

Это сообщение отредактировал(а) rumit7 - 18.12.2011, 12:32
PM MAIL   Вверх
volatile
Дата 18.12.2011, 01:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Код

size_t size = last - first;
if(sizeof(T) > size)
{ ...

 smile

Добавлено через 6 минут и 12 секунд
или даже так:
size_t size = abs(last - first);
чтоб случайно не перепутать местами.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.