2013-05-29 124 views
0

我把函數參數當作char *,在我的例子中我得到XOR等於210.另一方面,在另一個VS中,我把第一個參數不是char *但只是char []和XOR是114,這是正確的。char *和char []得不到相同的輸出

有什麼不對?爲什麼我不能在這裏得到同樣的東西?

感謝您的回覆。

更新:你說得對。 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; 
} 

解決:是的,我忘了初始化異或。

+0

由於你正在爲你的小號碼加65536(0x10000),第三個十六進制數字怎麼可能不是1? Linux的'sprintf'輸出顯示正確(除了不顯示'iAzimuthAngle'的確切值)。 – user4815162342

+3

你如何用一個字符而不是char *調用sprintf而不會收到編譯錯誤?此外,十六進制96是150,而不是15. – riv

+0

你能發佈一個完整的,可編譯的,不符合你期望的例子,以及你的期望嗎? – user4815162342

回答

2
int iAngle = 15; // for example 
char HAngle; 

iAngle = 65536 + iAngle; 

所以iAngle == == 65536 + 1565551在十六進制是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必須始終在這種情況下,一個十六進制1

它看起來像Windows的功能是做一些奇怪的事情......

而且HAngle應該是一個數組,如果你要打印到它,否則你滿溢的方式分配給它的存儲。當你打電話給sprintf時,你似乎可以把它當作指針,所以我假設你的意思是char *HAngle,並在打印之前爲緩衝區分配了內存?

編輯:從您更新的代碼,它看起來像XOR未初始化?如果不是,那麼它可以以任何隨機值開始(編譯器不必將其設置爲零,我害怕:))。這可能會導致不同的結果。在雙方它可以有一個任意的初始值,只是發生在一邊有一個零初始值...

+0

是的,我分配了char包[18];在調用上面的函數之前。 – Sam

+1

好的。 XOR未初始化 - 這可能是問題 – Jimbo

5

您的問題是不是與sprintf_ssprintf。值65536 + 150 => 65686 => 0x10096。

這是由您的代碼打印的正確結果,其他任何東西都是一個錯誤。順便說一句,我認爲你的意思是150,而不是15,因爲0x96 => 150.

它可以是,你的Windows版本的iAngle是無符號的短,所以它環繞,你實際上得到150而不是65536 + 150?這將解釋'00000096'的輸出,但這意味着它是原始計算代碼中的一個錯誤,而不是打印本身。

順便說一下,我假設實際的代碼沒有char HAngle;,但是像char HAngle[..];類似的東西,否則任何事情都可能發生,如果編譯器出於某種原因入睡並不會產生錯誤。

編輯: 更新後的代碼顯示XOR未初始化,它可以包含任何東西,然後它用於計算,所以你可以得到任何結果。您必須先將其設置爲0。在Windows端,如果您正在測試將整型變量設置爲0或純粹機會的調試版本,則可能會起作用。

+0

是的,我分配了char數據包[18];在調用上面的函數之前。 – Sam

+1

ok - 然後在windows代碼中檢查'iAngle'的類型。你使用什麼編譯器? –

+0

iAngle是整數。編譯器是視覺c – Sam

2

原來的問題沒有多大意義:除非將HAngle更改爲數組(或指向數組的指針),否則代碼將不會編譯;十六進制96是十進制的150,不是15;並且您獲得額外的1,因爲您正在爲該值添加65536(十六進制10000)。

在更新後的問題中,您將得到一個不確定的值XOR(和技術上未定義的行爲),因爲您從不初始化它。你想要:

int XOR = 0; 
     ^^^