我一直在尝试创建一个for循环,它将根据网络数据包的长度进行迭代。在API中,event.packet-> dataLength存在变量(size_t)。我想从0迭代到event.packet-> dataLength - 7每次迭代时我增加10,但我遇到了麻烦。
我寻找解决方案但却找不到任何有用的东西。我尝试将size_t转换为unsigned int并使用它进行算术但不幸的是它没有用。基本上我只想要这个:
for (int i = 0; i < event.packet->dataLength - 7; i+=10) { }
虽然每次我做这样的事情或尝试我的转换时,i&lt; #part是一个巨大的数字。他们在API的教程中给出了一个printf语句,它使用“%u”来打印实际数字,但是当我将它转换为unsigned int时,它仍然是不正确的。我不知道从哪里开始。任何帮助将不胜感激:)
答案 0 :(得分:4)
为什么不更改i
的类型?
for (size_t i = 0; i < event.packet->dataLength - 7; i+=10) { }
尽量保持所有变量的类型使用相同的类型;应该避免演员阵容。
在C ++ 03中没有size_t
的格式说明符,你必须转换为最大的无符号整数类型并打印它。 (C ++ 0x中size_t
的格式说明符为%zu
)。但是,您不应该使用printf
:
std::cout << i; // print i, even if it's a size_t
虽然流可能更冗长,但它们更安全,并且不需要您记住任何内容。
请记住,您的实际循环逻辑可能存在缺陷。 (正如genpfault所说,当dataLength - 7
为负数时会发生什么?)
答案 1 :(得分:2)
用签名算术做所有事情。尝试:
for (int i = 0; i < int(event.packet->dataLength) - 7; i+=10) { }
一旦开始使用可能为负的值的无符号算术,并使用<
等比较运算符,就会遇到麻烦。保持签名更容易。
答案 2 :(得分:1)
dataLength&gt; = 7?如果dataLength-7的结果为负数,如果将其解释为无符号,则结果为非常大的整数。
答案 3 :(得分:0)
将size_t用于i。
对于printf,如果你没有C99,只有C90,转换为无符号长,或无符号长。 E.g:
for (size_t i = 0; i < 10; ++i)
//printf("%llu\n", (unsigned long long)i);
printf("%lu\n", (unsigned long)i);
否则使用%zu
答案 4 :(得分:0)
您应首先检查是否event.packet->dataLength < 7
。现在,如果它小于7,则得到小于0的值作为无符号使用:例如0 = 0x00000000; -1 = 0 - 1 = 0xFFFFFFFF。
再次,检查:
if (event.packet->dataLength < 7) {
...
} else {
for (size_t i = 0; i < event.packet->dataLength - 7; i+=10) { }
}
答案 5 :(得分:0)
“每次我做这样的事情或尝试转换时,我都会发现这个数字很大。”
表示原始数据包长度小于7(你减去7)。
一种解决方法是使用实践中足够大的有符号整数类型,标准库为此提供ptrdiff_t
。像,
#include <stdlib.h> // Not sure, but I think it was this one.
typedef ptrdiff_t Size;
typedef Size Index;
void foo()
{
// ...
for( Index i = 0; i < Size( event.packet->dataLength ) - 7; i += 10 )
{
// ...
}
}
更麻烦的解决方法是将整个内容嵌入到if
中,以检查大小是否至少为7。
干杯&amp;第h。,
答案 6 :(得分:0)
由于event.packet->dataLength
返回无符号类型size_t
:
1)使用size_t
作为索引变量类型。
2)确保数学不会下溢。 @beldaz。不是从event.packet->dataLength
中减去7,而是将{7}添加到i
。
// for (int i = 0; i < event.packet->dataLength - 7; i+=10) { }
for (size_t i = 0; i + 7 < event.packet->dataLength; i += 10) { }