9

私は、ネットワークパケットの長さに基づいて反復するforループを作成しようとしています。APIには、event.packet-> dataLengthによる変数(size_t)があります。0からevent.packet->dataLength-7まで反復したいのですが、反復するたびにiを10ずつ増やしていきますが、問題が発生しています。

私は解決策を探しましたが、有用なものを見つけることができませんでした。size_tをunsignedintに変換し、それを使って算術演算を実行しようとしましたが、残念ながら機能しませんでした。基本的に私が欲しいのはこれだけです:

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

私がこのようなことをしたり、変換を試みたりするたびに、i <#の部分は膨大な数になります。彼らは、「%u」を使用して実際の数値を出力するAPIのチュートリアルでprintfステートメントを提供しましたが、それをunsigned intに変換すると、それでも正しくありません。ここからどこへ行けばいいのかわからない。どんな助けでも大歓迎です:)

4

7 に答える 7

4

タイプを変えてみませんiか?

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

一緒に使用されるすべての変数の型を同じ型に保つようにしてください。キャストは避けてください。

size_tC ++ 03にはフォーマット指定子はありません。可能な限り最大の符号なし整数型にキャストし、それを出力する必要があります。size_t( C ++ 0xでのフォーマット指定子はです%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

dataLength> = 7ですか?dataLength-7の結果が負の場合、それを符号なしと解釈すると、結果は非常に大きな整数になります。

于 2011-01-13T22:52:44.887 に答える
0

iにはsize_tを使用します。

printfの場合、C99がない場合は、C90のみ、unsigned longにキャストするか、unsignedlonglongにキャストします。例えば:

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を引いています)。

1つの修正は、実際には十分に大きい符号付き整数型を使用することであり、標準ライブラリは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 に答える