ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 17.05.2010, 12:54
Аватар для greki_hoy
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

Репутация: 23
По умолчанию

2 d_x

int i, len;
for(i = 0, len = sizeof(arr)/sizeof(arr[0]); i < len; i++)
//...
sizeof(arr)/sizeof(arr[0]) это выражение после вычисления
на x64 имеет размер 64 значащих бита потом
в результате присваивания
len = sizeof(arr)/sizeof(arr[0])
обрезаются старшие 32 бита результат будет неверный в len
но на 32 битной системе с этим проблем не будет
но могут быть другие
sizeof(arr)/sizeof(arr[0]) вернет 32 значащих бита рассмариваемых
как беззнаковое число но у Вас в len может оказатся
отрицательное число после присваивания (если 31 бит включен
будет он рассматривается как знак в len) так как у Вас len знаковая
переменная то это условие i < len никогда не выполнится
не будет ни одной итерации цикла

Последний раз редактировалось greki_hoy; 17.05.2010 в 13:00..
 
Ответить с цитированием

  #12  
Старый 17.05.2010, 13:53
Аватар для d_x
d_x
Reservists Of Antichat - Level 6
Регистрация: 25.03.2008
Сообщений: 670
Провел на форуме:
4137635

Репутация: 2407


По умолчанию

Цитата:
sizeof(arr)/sizeof(arr[0]) вернет 32 значащих бита рассмариваемых
как беззнаковое число но у Вас в len может оказатся
отрицательное число после присваивания (если 31 бит включен
будет он рассматривается как знак в len) так как у Вас len знаковая
переменная то это условие i < len никогда не выполнится
Я так понимаю, что такое может произойти, если в массиве будет очень много элементов только, больше 2147483647.
Цитата:
sizeof(arr)/sizeof(arr[0]) это выражение после вычисления
на x64 имеет размер 64 значащих бита потом
в результате присваивания
len = sizeof(arr)/sizeof(arr[0])
обрезаются старшие 32 бита результат будет неверный в len
А это - когда еще больше.

Эта ситуация в рамках данной задачи нереальна по-моему. Если бы здесь была возможна такая ситуация, я бы использовал unsigned int.
 
Ответить с цитированием

  #13  
Старый 17.05.2010, 15:03
Аватар для greki_hoy
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

Репутация: 23
По умолчанию

вот что бы об этом потом не думать и не рафакторить код под x64
можно сразу написать так
size_t i, len;
for(i = 0, len = sizeof(arr)/sizeof(arr[0]); i < len; i++)
в зависимости от платформы меняет разрядность плюс беззнаковый
 
Ответить с цитированием

  #14  
Старый 17.05.2010, 15:39
Аватар для greki_hoy
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

Репутация: 23
По умолчанию

2 d_x табличка пригодится

Код:
Тип	Размерностьтипа наплатформеx32 / x64	Примечание
int	32 / 32	Базовый тип. На 64-битных системах остался 32-битным.
long	32 / 32	Базовый тип. На 64-битных Windows системах остался 32-битным. Учтите, что в 64-битных Linux системах этот тип был расширен до 64-бит. Не забывайте об этом если разрабатываете код, который должен работать компилироваться для Windows и для Linux систем.
size_t	32 / 64	Базовый беззнаковый тип. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. В тип size_t может быть безопасно помещен указатель (исключение составляют указатели на функции классов, но это особенный случай).
ptrdiff_t	32 / 64	Аналогичен типу size_t, но является знаковым. Результат выражения, где один указатель вычитается из другого (ptr1-ptr2), как раз будет иметь тип ptrdiff_t.
Указатель	32 / 64	Размер указателя напрямую зависит от разрядности платформы. Будьте аккуратны при приведении укзателей к другим типам.
__int64	64 / 64	Знаковый 64-битный тип.
DWORD	32 / 32	32-битный беззнаковый тип. Объявлен в WinDef.h как:typedef unsigned long DWORD;
DWORDLONG	64 / 64	64-битный беззнаковый тип. Объявлен в WinNT.h как:typedef ULONGLONG DWORDLONG;
DWORD_PTR	32 / 64	Беззнаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:typedef ULONG_PTR DWORD_PTR;
DWORD32	32 / 32	32-битный беззнаковый тип. Объявлен в BaseTsd.h как:typedef unsigned int DWORD32;
DWORD64	64 / 64	64-битный беззнаковый тип. Объявлен в BaseTsd.h как:typedef unsigned __int64 DWORD64;
HALF_PTR	16 / 32	Половина указателя. Объявлен в Basetsd.h как:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif
INT_PTR	32 / 64	Знаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif
LONG	32 / 32	Знаковый тип, который остался 32-битным. Поэтому во многих случаях теперь следует использовать LONG_PTR. Объявлен в WinNT.h как:typedef long LONG;
LONG_PTR	32 / 64	Знаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif
LPARAM	32 / 64	Параметр для посылки сообщений. Объявлен в WinNT.h как:typedef LONG_PTR LPARAM;
SIZE_T	32 / 64	Аналог типа size_t. Объявлен в BaseTsd.h как:typedef ULONG_PTR SIZE_T;
SSIZE_T	32 / 64	Аналог типа ptrdiff_t. Объявлен в BaseTsd.h как:typedef LONG_PTR SSIZE_T;
ULONG_PTR	32 / 64	Беззнаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif
WORD	16 / 16	Беззнаковый 16-битный тип. Объявлен в WinDef.h как:typedef unsigned short WORD;
WPARAM	32 / 64	Параметр для посылки сообщений. Объявлен в WinDef.h как:typedef UINT_PTR WPARAM;
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ай нид хелп A_n_d_r_e_i Болталка 3 25.02.2010 11:45
Нид хелп ~Dala$$~ PHP, PERL, MySQL, JavaScript 11 28.01.2007 21:04
Ай нид хелп! Grinder Болталка 12 22.06.2006 05:51



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ