2013-04-25 63 views
-3

我想在下面的代码中实现的是找到移动平均值;移动平均计算中的未初始化变量

int slots = int ((sr+e)/mst); // finding number of slots 


int temp2; 
int temp1; 

if (temp1 == null) 
{ 
temp2 = 0; 
} 

temp2=temp1; // previously found number of slots 
temp1=slots; // presently found number of slots 
double mov_avg = (temp2+temp1)/2; //moving average 

问题是,当我编译时,我得到一个警告temp1被初始化;在做一个小小的研究后,我发现变量在未初始化时不会在C++中默认存储空值或零值;

我不能在代码中放置一行作为temp1 = 0,因为它的值将被传递到temp2变量的下一个迭代需要;这两者都需要计算移动平均线。

所以,基本上这是上述程序第一次运行的问题;因为如果你经过它,上面的逻辑对移动平均计算就足够了。你们有什么感想?

在此先感谢。

+0

看起来你可以通过在每次迭代中只有'value =(value + nextitem)/ 2;'来简化这个过程。 – 2013-04-25 08:03:16

+0

@KerrekSB:我不认为这是正确的。拿下面的例子:'90; 10; 0'。移动平均值超过两个值将是'50; 5'您的公式会给出'50; 25'。或者我错过了什么? – 2013-04-25 08:15:36

+0

如果您已经预计变量被默认初始化为零,为什么不能手动执行并获得相同的影响?由于行为未定义,因此在使用它们之前不进行初始化是没有意义的。 'int temp1 = 0;' – 2013-04-25 08:20:47

回答

2

最简单的办法就是用你的序列的第一个值来初始化变量:

int prev = getValue(); 

while (valuesAvailable()) 
{ 
    int next = getValue(); 
    double moving_average = (prev + next)/2.; 
    // use moving_average 
    prev = next; 
} 

请注意,我假设有你的序列中的至少一个值:您可能需要之前做的检查获得第一个价值,以确保它确实存在。