better to compare the size of size_t and the size of INT_PTR in the assert
"Mikel" <mikel.luri@gmail.com> ha scritto nel messaggio
news:047133cf-1e98-4df7-99a6-cd4bcbf590d0@c2g2000pra.googlegroups.com...
for (INT_PTR i = 0; i < myArray.GetCount(); i++)
{
c_List.InsertItem(i, [...]);
[...]
}
The problem is I get a warning C4244 in InsertItem, because InsertItem
takes an int, so I'm converting an INT_PTR to int.
I would write the loop using 'int', because CListCtrl::InsertItem()
requires a an int for the item index.
In fact, you wrote a correct thing here:
Actually, I'm quite sure myArray won't be as big as to really have a
problem with this, and if it were, a CListCtrl would not be a good way
to show its contents.
So, just do:
int count = static_cast< int >( myArray.GetCount() );
for ( int i = 0; i < count; i++ )
{
c_List.InsertItem(i, ... );
...
}
A similar problem occurs with STL containers, that tend to use a size_t to
represent size, and size_t is defined as 'unsigned int', so in case you
use e.g. std::vector instead of CArray in the loop, there is a type
mismatch in the loop index (int) and array size (size_t).
As you kind of already wrote, considering that an int can store a maximum
positive value of 2^31-1 (on 32 bit) = 2,147,483,647, I consider that
value in lots of cases as a good reasonable maximum value.
However, for very robust code, you may consider a debug assertion (or
throwing a C++ STL exception) before the cast (at least for a size_t based
container):
ASSERT( myVector.size() <= 2147483647 );
int count = static_cast< int >( myVector.size() );
for ( int i = 0; i < count; i++ )
{
c_List.InsertItem( i, ... );
}
Or you may define a safe conversion function:
<code>
inline int size2int( size_t s )
{
// Make sure the cast from size_t to int is safe
const int maxValue = 2^31 - 1;
ASSERT( s <= maxValue ); // or throw...
return static_cast< int >( s );
}
</code>
and just use that.
Giovanni