0

関数の引数を char* として取りました。私の場合、XOR は 210 に等しくなります。一方、他の VS では、最初の引数を char* ではなく単に char[] と取り、XOR は 114 です。正しい。

どうしたの?なぜここで同じものを手に入れることができないのですか?

返信ありがとうございます。

更新:あなたは正しいです。sprintf() は正常に動作します。問題は残りのコードです。

bool BuildAnglePacket(char* WR_PacketAZAngle, float AZAngle)
{

    WR_PacketAZAngle[0] = 0x04;
    WR_PacketAZAngle[1] = 0x30;
    WR_PacketAZAngle[2] = 0x31;
    WR_PacketAZAngle[3] = 0x02;
    WR_PacketAZAngle[4] = 0x79;
    WR_PacketAZAngle[5] = 0x4E;
    WR_PacketAZAngle[6] = 0x48;

    int  XOR;
    char HAnlge[9];
    int iAzimuthAngle;

//    AZAngle = 22;

    if (AZAngle >= -22.5 &&  AZAngle <= 22.5)
    {
        iAzimuthAngle = AZAngle*10;

        if( AZAngle < 0)
        {
            iAzimuthAngle= abs(iAzimuthAngle);
            iAzimuthAngle=((~iAzimuthAngle)&0xFFFF) + 1 ;
        }

        iAzimuthAngle = 65536 + iAzimuthAngle;

        sprintf(HAnlge,"%08X", iAzimuthAngle);

        WR_PacketAZAngle[7]  = HAnlge[0];
        WR_PacketAZAngle[8]  = HAnlge[1];
        WR_PacketAZAngle[9]  = HAnlge[2];
        WR_PacketAZAngle[10] = HAnlge[3];
        WR_PacketAZAngle[11] = HAnlge[4];
        WR_PacketAZAngle[12] = HAnlge[5];
        WR_PacketAZAngle[13] = HAnlge[6];
        WR_PacketAZAngle[14] = HAnlge[7];
        WR_PacketAZAngle[15] = 0x03;

        for(int i=4;i<16;i++)
            XOR ^= WR_PacketAZAngle[i];

        WR_PacketAZAngle[16] = XOR;
        WR_PacketAZAngle[17] ='\x0';
    }

    return true;
}

解決済み: はい、XOR を初期化するのを忘れていました。

4

3 に答える 3

5

あなたの問題はsprintf_sまたはではありませんsprintf。値 65536 + 150 => 65686 => 0x10096。

これはコードによって出力された正しい結果であり、それ以外はバグです。ところで、0x96 => 150 として、15 ではなく 150 を意味していたと思います。

お使いの Windows バージョンの iAngle が unsigned short であるため、ラップ アラウンドし、実際には 65536+150 ではなく 150 になるのでしょうか? これは '00000096' の出力を説明しますが、これは印刷自体ではなく、元の計算コードのバグであることを意味します。

ところで、実際のコードには何もないchar HAngle;と思いchar HAngle[..];ますが、何らかの理由でコンパイラがスリープ状態になり、エラーが発生しない場合は、何かが発生する可能性があります。

編集:更新されたコードは、XOR初期化されていないことを示しており、計算に使用される前に何でも含めることができるため、結果を得ることができます。最初に 0 に設定する必要があります。Windows 側では、整数変数を 0 に設定するデバッグ バージョンをテストしていた場合、またはまったくの偶然で動作した可能性があります。

于 2013-05-29T11:49:09.813 に答える
2
int iAngle = 15; // for example
char HAngle;

iAngle = 65536 + iAngle;

したがって、 iAngle== 65536 + 15==65551は 16 進数で0x0001000F. それを文字列に出力すると、次のようになりますか?

[0]    48 '0'
[1]    48 '0'
[2]    48 '0'
[3]    49 '1'
[4]    48 '0'
[5]    48 '0'
[6]    48 '0'
[7]    70 'F'
[8]    0 '\0'

この場合、インデックス3は常に16進数でなければなりませんか?1

Windows関数が奇妙なことをしているようです...

またHAngle、印刷する場合は配列にする必要があります。そうしないと、割り当てられたストレージがオーバーフローします。呼び出すときにポインターとして扱うことができるように見えるsprintfのでchar *HAngle、印刷する前にバッファーにメモリを割り当てていると思いますか?

編集:更新されたコードから、XOR初期化されていないように見えますか? そうでない場合は、任意のランダムな値で開始できます (コンパイラはそれをゼロに設定する必要はありません:))。これは、異なる結果を説明する可能性があります。両側で任意の初期値を持つことができ、片側でゼロの初期値を持つことが起こります...

于 2013-05-29T11:48:56.303 に答える
2

元の質問はあまり意味がありません。HAngle配列 (または配列へのポインター) に変更しない限り、コードはコンパイルされません。16 進数の 96 は 15 ではなく 10 進数の 150 です。1値に 65536 (16 進数の 10000) を追加しているため、余分な値が得られます。

更新された質問では、XOR初期化しないため、不確定な値(および技術的に未定義の動作)が得られます。あなたがしたい:

int XOR = 0;
        ^^^
于 2013-05-29T12:07:45.433 に答える