丢失数据来自double和Error:Windows在exe中触发了断点。这可能是由于堆的损坏,

时间:2016-03-16 19:21:14

标签: c++ arrays pointers

我已经在这段代码上工作了一段时间,我几乎让它工作但我遇到了问题。我在排序数据时丢失了数据。我输入的数字越多,数字越多,显示的是整数。 link to the image of my output

此外,一旦代码运行,我将收到一个带有此消息的弹出窗口(我注意到在我添加了sum函数和之后的每个函数并且我没有按F12时出现此错误):

“Windows在project3.exe中触发了断点。

这可能是由于堆的损坏,这表示project3.exe或它已加载的任何DLL中存在错误。

这也可能是由于用户在按下F12时 project3.exe具有焦点。

输出窗口可能包含更多诊断信息。 “

这是我的代码: 在最后编号的输入后询问用户输入数字,他们必须按0,它显示数据,显示一些统计数据并对数据进行排序。 我没有检查用户错误

(*如果我不使用system("pause"),终端窗口会关闭,这就是为什么它就在那里我知道我应该'delete []arr但它会在我放零后给我断点信息这就是为什么它被评论出来)

#include <iostream>
#include <iomanip>
using namespace std;
void getdata(double *arr, double &data, int &floatpt);
void display (double *arr, int floatpt);
void computesum (double *arr, int floatpt, double sum);
void computearthmeticmean (double *arr, int floatpt, double aMean);
void computeharmonicmean (double *arr, int floatpt, double hMean);
void median(double *arr, int floatpt);
void sort (double *arr, int floatpt);
int main ()
{
    double data, sum=0, aMean=0, hMean=0;
    int count=0, floatpt;
    double *arr =new double[count]; 

    getdata (arr, data, floatpt);
    cout<<"Thank you.  The data you entered are "<<endl; 
    display(arr, floatpt);
    cout<<"The following statistics were computed "<<endl;
    computesum(arr,floatpt, sum);
    computearthmeticmean(arr, floatpt, aMean);
    median(arr, floatpt);
    computeharmonicmean (arr, floatpt, hMean);
    sort(arr, floatpt);
    cout<<"The original data set is "<<endl;
    display(arr, floatpt);
    cout<<"Thank you for using this program.  Enjoy your statistics "<<endl;

    //delete []arr;


   system ("pause");
   return 0;
}
void getdata(double *arr, double &data, int &floatpt)
{
    int count=0; 

    cout<<"Please enter floating point data.\n"; 
    cout<<"After the last number has been entered press 0 (zero) \n"; 
    do
    {
        cin>>arr[count]; 
        data = arr[count]; 

        count++; 

    }while(data != 0);
    floatpt=(count-1);

 }
void display (double *arr, int floatpt)
{
    for(int i=0; i<floatpt; i++) 
    { 
        cout<<arr[i]<<endl;
    }

}
void computesum (double *arr, int floatpt, double sum)
{
    for (int j=0; j<floatpt; j++)
    {
        sum+=arr[j];
    }
    cout<<"Sum: "<<sum<<endl;

}
void computearthmeticmean (double *arr, int floatpt, double aMean)
{
    for (int a=0; a<floatpt; a++)
    {
        aMean+=arr[a];
    }
    aMean=aMean/floatpt;
    cout<<"Arithmetic Mean: "<<aMean<<endl;

}
void computeharmonicmean (double *arr, int floatpt, double hMean)
{
    for (int h=0; h<floatpt; h++)
    {
        hMean+=(1/arr[h]);
    }
    hMean=floatpt/hMean;
    cout<<"Harmonic Mean: "<<hMean<<endl;

}
void median(double *arr, int floatpt)
{
    int temp;
    double median;

    for (int s=0; s<floatpt; s++) 
    {
        for (int r=0; r<(floatpt-1); ++r) 
        {
            if (arr[r] > arr[r+1]) 
            {
                temp = arr[r];
                arr[r] = arr[r+1];
                arr[r+1] = temp;
            }
        }

        if (floatpt%2 == 0)
        {
            median = (arr[s/2] + arr[(s/2)-1])/2.0;
        }
        else
        {
            median = arr[s/2]/1.0;
        }
    }

    cout<<"Median: "<<median<<endl;

}
void sort (double *arr, int floatpt)
{
    cout<<"The sorted data set is: "<<endl;
    for (int sd=0; sd<floatpt; sd++) 
    {
        cout<<arr[sd]<<endl;
    }
}

1 个答案:

答案 0 :(得分:1)

int count=0, floatpt;
double *arr =new double[count]; 

count为0,因此您创建的数组没有分配。因此,在getdata中,您会读入超出范围的内存位置。

您打算稍后重新分配吗?

也许如果您尝试使用std::vector<double>,那么事情就会成功。它会自动调整大小,并且可以很容易地进行边界检查。

像这样(未经测试):

#include <vector>
// ...
std::vector<double> data;
getdata(arr);
// ...

void getdata(std::vector<double>& arr)
{
    double nextValue;

    cout<<"Please enter floating point data.\n"; 
    cout<<"After the last number has been entered press 0 (zero) \n"; 
    cin>>nextValue; 
    while(nextValue != 0)
    {
       arr.push_back(nextValue);
       cin >> nextValue;
    }
 }