2

コードに問題があります。コードを実行すると、短い「オペコード」の値が 52496と間違っています。そのため、コードを段階的にデバッグします...そして、この「オペコード」を実行すると、正しい値 4624 になります。誰かが私にヒントを与えることができますか?

void packet_get()
{
    boost::shared_ptr<boost::array<unsigned char, 2>> opc(new boost::array<unsigned char, 2>);
    recv_two_bytes(opc);
    unsigned short opcode;

    unsigned char * test[2];
    test[0] = &opc->at(0);  // *test[0] == 0x12
    test[1] = &opc->at(1);  // *test[1] == 0x10

    opcode = 0;
    int i = 0;
    for(i = 0; i <= 1; i++)
    {
        opcode = (opcode<<8) | *(test[i]);
    }
    // opcode should now be short 4624
}
4

1 に答える 1

3

通常、通常の実行とデバッグの実行でプログラムの動作が異なる場合、それは未定義の動作が原因です。そのようなよくある間違いの 1 つは、初期化されていない変数です。

プログラムを実行すると、おそらく初期化されていないスタックが渡されます。デバッグ モードでは、デバッガーがこのスタックを初期化することができます。したがって、初期化されていない変数は、デバッグと通常の実行で簡単に異なる値を持つことができます (ほとんどの場合、変数に実際に与えたかったのに忘れてしまったデバッグ モードでは 0 です)。

関数にそのようなエラーがあるようですrecv_two_bytes。コンパイラですべての警告を有効にすると、問題がより些細な場合に問題を突き止めるのに役立ちます。

配列からのインデックス作成など、他のエラーにも注意してください。

于 2012-05-05T01:09:26.833 に答える