Converting a size_t into an integer (c++)

JeanOTF picture JeanOTF · Jan 13, 2011 · Viewed 16.3k times · Source

I've been trying to make a for loop that will iterate based off of the length of a network packet. In the API there exists a variable (size_t) by event.packet->dataLength. I want to iterate from 0 to event.packet->dataLength - 7 increasing i by 10 each time it iterates but I am having a world of trouble.

I looked for solutions but have been unable to find anything useful. I tried converting the size_t to an unsigned int and doing the arithmetic with that but unfortunately it didn't work. Basically all I want is this:

for (int i = 0; i < event.packet->dataLength - 7; i+=10) { }

Though every time I do something like this or attempt at my conversions the i < # part is a huge number. They gave a printf statement in a tutorial for the API which used "%u" to print the actual number however when I convert it to an unsigned int it is still incorrect. I'm not sure where to go from here. Any help would be greatly appreciated :)

Answer

GManNickG picture GManNickG · Jan 13, 2011

Why don't you change the type of i?

for (size_t i = 0; i < event.packet->dataLength - 7; i+=10) { }

Try to keep the types of all variables used together the same type; casts should be avoided.

There is no format specifier for size_t in C++03, you have to cast to the largest unsigned integer type you can and print that. (The format specifier for size_t in C++0x is %zu). However, you shouldn't be using printf anyway:

std::cout << i; // print i, even if it's a size_t

While streams may be more verbose, they're more type safe and don't require you to memorize anything.

Keep in mind your actual loop logic may be flawed. (What happens, as genpfault notes, when dataLength - 7 is negative?)