9

我一直在尝试制作一个 for 循环,它将根据网络数据包的长度进行迭代。在 API 中,通过 event.packet->dataLength 存在一个变量 (size_t)。我想从 0 迭代到 event.packet->dataLength - 7 每次迭代时将 i 增加 10,但我遇到了麻烦。

我寻找解决方案,但找不到任何有用的东西。我尝试将 size_t 转换为 unsigned int 并用它进行算术运算,但不幸的是它不起作用。基本上我想要的是这个:

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

尽管每次我做这样的事情或尝试转换时, i < # 部分都是一个巨大的数字。他们在 API 教程中给出了 printf 语句,该语句使用“%u”打印实际数字,但是当我将其转换为无符号整数时,它仍然不正确。我不知道从这里去哪里。任何帮助将不胜感激 :)

4

7 回答 7

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是负数?)

于 2011-01-13T22:49:07.863 回答
2

用有符号算术做所有事情。尝试:

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

一旦你开始使用可能为负数的无符号算术,并使用比较运算符,如<,你就有麻烦了。更容易保持签名。

于 2011-01-13T22:57:22.273 回答
1

数据长度 >= 7 吗?如果 dataLength-7 的结果为负数,如果将其解释为无符号,则结果是一个非常大的整数。

于 2011-01-13T22:52:44.887 回答
0

对 i 使用 size_t。

对于 printf,如果没有 C99,只有 C90,强制转换为 unsigned long 或 unsigned long long。例如:

for (size_t i = 0; i < 10; ++i)
        //printf("%llu\n", (unsigned long long)i);
        printf("%lu\n", (unsigned long)i);

否则使用 %zu

于 2011-01-13T22:53:39.277 回答
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) { }
}
于 2011-01-13T22:55:16.443 回答
0

“每次我做这样的事情或尝试我的转换时, i < # 部分都是一个巨大的数字。”

这表明原始数据包长度小于 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 的文件中。

干杯&hth.,

于 2011-01-13T22:58:12.967 回答
0

由于event.packet->dataLength返回无符号类型size_t

1)size_t用作索引变量类型。

2) 确保数学不会下溢。 @beldaz。不是从 中减去 7 ,而是在 中event.packet->dataLength添加 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) { }
于 2015-06-29T15:04:04.087 回答