我的编译器一直告诉我“CRT检测到应用程序在堆缓冲区结束后写入内存”?有没有什么办法解决这一问题?
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <math.h>
using namespace std;
double randomgen(double min, double max)
{
double range = (max - min);
double div = RAND_MAX / range;
return min + (rand() / div);
}
void generateWalk(double *data, int n, double T, double sigma)
{
double Delta = sigma*(sqrt(T/n));
double X;
data[0] = 0;
if(randomgen(0,1)<0.5)
{
X = Delta;
for(int i=1; i<=n; i++)
{
data[i] = data[i-1] + X;
}
}
else
{
X = -Delta;
for(int i=1; i<=n; i++)
{
data[i] = data[i-1] + X;
}
}
}
void ensembledata(double *data, int nperwalk, int nens, double T,double sigma)
{
double *storer = new double[nens];
for (int j=0;j<nens;j++)
{
generateWalk(data,nperwalk,T,sigma);
storer[j]=data[nperwalk-1];
}
for (int k=0;k<nens;k++)
{
data[k-1]=storer[k-1];
}
delete [] storer;
}
void meanvar(double *data,int size, double *mean,double *var)
{
double sum = 0;
double *first = data;
int k = 0;
for(k = 0; k < size; k++)
sum += *data++;
*mean = sum/size;
sum = 0;
data = first;
for(k = 0; k < size; k++)
sum += (*data - *mean)*(*data++ - *mean);
*var = sum/(size - 1);
}
int main()
{
srand((unsigned)time(nullptr));
double *mdata = new double[1000], mean = 0, var = 0;
generateWalk(mdata, 1000, 10, 1);and record last position
ensembledata(mdata, 1000, 1000, 10, 1);
meanvar(mdata, 1000, &mean, &var);
cout << fixed << setprecision(3);
cout << "mean = " << setw(7) << mean << ", var = " << setw(7) << var << endl;
double sigvals[] = {1,2,3,4,5,6,7,8,9};
int i = 0;
for(i = 0; i < 9; i++)
{
ensembledata(mdata, 1000, 1000, 10, sigvals[i]);
meanvar(mdata, 1000, &mean, &var);
cout << "mean = " << setw(7) << mean << ", var = " << setw(7) << var <<
", sigma = " << setw(7) << sigvals[i] << endl;
}
delete [] mdata;
system("PAUSE");
return EXIT_SUCCESS;
}
我真的不能想到代码中哪种特定的艺术造成了这个问题?
1 回答
修复语法错误(“并记录最后位置”)后,我编译并发出警告:
所以我纠正了这一行
然后Valgrind抱怨对无效位置的一些写入:
所以有三条感兴趣的线:27,35和51.你可能会看到第27行出了什么问题:
将
i<=n
更改为i<n
会停止在此处运行数组末尾的代码 .第35行是类似的 . 第51行有一个不同的问题:
你可以看到第一次循环,我们访问
data[-1]
. 将k=0
更改为k=1
可以避免这种情况 . 或许我们需要将data[k-1]=storer[k-1]
更改为data[k]=storer[k]
以复制所有值;那里有's insufficient commentary to understand what'的意图 .修复这三个问题可以成功完成(除了
system
调用的shell中的消息"PAUSE: not found");我不知道输出是否正确 .