2010-07-14 60 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