2010-07-14 57 views
1

目前,我有以下幾點:C++的cout使用float產生奇怪的結果

float some_function(){ 
    float percentage = 100; 
    std::cout << "percentage = " << percentage; 

    //more code 
    return 0; 
} 

這給輸出

percentage = 100 

然而,當我添加一些的std :: ENDL像這樣:

float some_function(){ 
    float percentage = 100; 
    std::cout << "percentage = " << percentage << std::endl; 

    //more code 
    return 0; 
} 

這給出了輸出:

percentage = 1000x6580a8 

添加更多endl的只是打印出更多0x6580a8的。

這可能是什麼原因造成的?這是在Ubuntu 10.04上使用gcc 4.4.3編譯的。

+2

怪異的shiznit。 :) – 2010-07-14 15:18:33

+0

您的代碼是逐字或轉述的? '0x6580a8'可能是'std :: endl'的地址。 – fredoverflow 2010-07-14 15:22:27

+0

@Fred,代碼是逐字。我將如何檢查這是否是std :: endl的地址? – shuttle87 2010-07-14 15:25:58

回答

1

您的代碼完全有效。我懷疑你可能會粉碎你的堆棧或堆棧中的其他部分,這是最可能的原因。 0x6580a8太短而無法成爲對象地址。另外,他不會在同一個程序的兩次運行中得到相同的地址。

+0

雖然我沒有在valgrind的錯誤/警告,我懷疑這可能會發生。該項目的代碼是非常大的,我沒有寫所有這些,調試這樣一個問題的最佳方法是什麼? – shuttle87 2010-07-14 15:36:55

+0

現在我已經開始尋找另外一個完全不相關的代碼塊了,我發現了另一個0x6580a8的輸出。 – shuttle87 2010-07-14 15:39:34

+1

你是什麼意思,太短不成爲一個地址。地址只是一個數字。爲什麼他不會在程序的不同運行中得到相同的地址(人們會希望計算機是確定性的)。我同意粉碎堆棧是一個很好的猜測,因爲我們有代碼,但還有其他選項(如操作符>>和函數指針的重寫錯誤)。 – 2010-07-14 16:17:49

2

功能寫入正確。在我的機器上(Ubuntu 10.04上的g ++ 4.4.3)一切正常。 你確定錯誤不是由代碼的其他部分造成的嗎?

+0

錯誤似乎在別處不幸:( 有很多麻煩再現這使我認爲有一些內存損壞正在進行... – shuttle87 2010-07-14 15:47:52

+0

如果你想分析內存使用情況嘗試Valgrind(http:// valgrind .org /)或使用一個體面的調試器(我發現在Eclipse中的一個值得推薦) – 2010-07-14 15:57:23

0

如果您嘗試過\ n,該怎麼辦?

std::cout << "percentage = " << percentage << "\n"; 
+0

'\ n'不會在輸出結尾添加任何內容。 – shuttle87 2010-07-14 15:36:02

+0

@ shuttle87 - 它可以在我的電腦上正常工作,可以用主要功能發佈整個代碼。 – JonH 2010-07-14 15:41:22

0

這是您的實際代碼,或者是否有其他類型的流而不是cout

這是取endl操縱器的地址,而不是將其應用於流,這意味着它無法看到您正在使用的流類型的匹配版本endl

如果您改用<< "\n" << std::flush會發生什麼?

+0

這是我的實際代碼,cout是流。使用<<「\ n」<< std :: flush工作正常。 – shuttle87 2010-07-14 15:38:39