当我尝试函数重载时,数组获取垃圾值

时间:2018-04-29 00:50:40

标签: c++ arrays overloading

我试图使用两个名为相同的函数来计算2个数字数组(其中一个类型为' float',另一个' int')的算术平均值。 出于某种原因,当我运行完整的程序时,其中一个数组给了我平均值的垃圾值。 代码如下所示 -

#include <iostream>
using namespace std;
// function declarations
float Mean (float[ ], int);
float Mean (int[ ], int);
//float SD (int[ ], int);
//float SD (float[ ], int size = 15);

int main( )
{
int Fib [15] = {0}; //declare and initialize the Fibonacci array
float Array[100] = {1.0,0.0}; //declare and initialize the floating point array

int sizeFib = sizeof(Fib)/sizeof(int);
int sizeArray = sizeof(Array)/sizeof(float);

//set float precision
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);

//generate the Fibonacci array
Fib[0] = 0; //by definition
Fib[1] = 1; //by definition
for (int i = 2; i < 15; ++i)
    Fib[i] = Fib[i-2] + Fib[i-1];

//generate the floating point array
for (int j = 0; j < 100; ++j)
    Array [j + 1] = Array[j] + 1 ;

//for (int k = 0; k < sizeArray; ++k)
    //cout << Array[k]<< endl;

cout << "The Arithmetic Mean of the Floating point Array is :" << Mean(Array, sizeArray) << endl;
cout << "The Arithmetic Mean of the Fibonacci Array is :" << Mean(Fib, sizeFib) << endl;

return 0;
}

//function definitions
float Mean (int array[ ], int size)
{
int sum = 0;
float mean;
for (int i = 0; i < size; ++i)
{
    sum += array[i];
}
mean = sum / size;
return mean;
}

float Mean (float array[ ], int size)
{
int sum = 0;
float mean;
for (int i = 0; i < size; ++i)
{
    sum += array[i];
}
mean = sum / size;
return mean;
}

我运行时获得的输出是 -

浮点数组的算术平均值为:50.00

Fibonacci数组的算术平均值为:74702368.00

为什么Fibonacci阵列出现了?

2 个答案:

答案 0 :(得分:0)

您将浮点值相加为整数值 之后,您将划分两个整数并期望浮点值。如果运算符的两个操作数都是相同类型,则运算符将使用这些类型。转换为浮动将在分配期间稍后,而不是在分割期间。

然而,你得到的疯狂数字是由于越界错误,正如@WhozCraig指出的那样。

答案 1 :(得分:0)

该错误出现在以下代码中:

for (int j = 0; j < 100; ++j)
    Array [j + 1] = Array[j] + 1 ;

此循环的最后一次迭代将尝试将Array[100]设置为浮点值。但这超出了数组的范围,它实际上似乎正在做的是将Fib数组的第一个元素设置为该值! (我想编译器选择将Fib数组放在内存中的Array数组之后。)

由于Fib数组包含整数,并且这是写一个浮点值,因此当它被解释为int时,你会得到一个看起来像垃圾的巨大整数。具体来说,float 100.0被解释为int 1120403456(因为这些值在内存中具有相同的位表示)。

我建议生成Array数组,类似于生成Fib数组的方法,方法是定义数组的第一个值,然后根据前一个值设置其余每个值:

Array[0] = 0;
for (int j = 1; j < 100; ++j)
    Array[j] = Array[j - 1] + 1;