求大神帮忙 vs2010中0x775a71b4 处有未经处理的错误: 0xC0000005: Access violation
求大神帮忙 vs2010中0x775a71b4 处有未经处理的异常: 0xC0000005: Access violation
CRect rect;
float a[2000];
int i;
int j;
CString str;
FILE *file;
file =fopen("F:\\data2.txt","r");
for(i=0;i<2000;i++)
{
fscanf(file,"%f,",&a[i]);
}
//倒序的实现
int M =2048;
int NV2=M/2;
int NM1=M-1;
int I,J,K=0;
float T;
I=J=1;
while(I<=NM1)
{
if(I<J)
{
T = a[J-1];//将A[J-1]的内容和A[I-1]的内容互换,借助于中间变量T
a[J-1]=a[I-1];
a[I-1]=T;
}
K=NV2;
while(K<J)
{
J-=K;
K/=2;
}
J+=K;
I++;
}
//FFT
Complex U,W,V,B[2050];
int LE,LE1,IP;
int N=(int)pow(2,float (11));
{ for(i=0;i<2000;i++)
B[i].Re =a[i];
B[i].Im =0.0;
}
float L=1;
while(L<=11)
{
LE=(int)pow(2,L);
LE1=LE/2;
U.Re=1.0f;
U.Im=0.0f;
W.Re=(float)cos(PI/(1.0*LE1));//计算W算子的值
W.Im=(float)-1.0*sin(PI/(1.0*LE1));
if(abs(W.Re)<1.0e-12)
W.Re=0.0f;
if(abs(W.Im)<1.0e-12)
W.Im=0.0f;
J=1;
while(J<=LE1)
{
I=J;
while(I<=N)
{
IP=I+LE1;
V.Re=(float)B[IP-1].Re*U.Re-B[IP-1].Im*U.Im;//计算复数运算A*U
V.Im=(float)B[IP-1].Re*U.Im+B[IP-1].Im*U.Re;
B[IP-1].Re=(float)B[I-1].Re-V.Re;//计算复数运算A-T
B[IP-1].Im=(float)B[I-1].Im-V.Im;
B[I-1].Re+=V.Re;//计算复数运算A+T
B[I-1].Im+=V.Im;
I+=LE;
}
float temp=U.Re;
U.Re=(float)U.Re*W.Re-U.Im*W.Im;//计算复数运算U*W
U.Im=(float)temp*W.Im+U.Im*W.Re;
J++;
}
L++;
}
for(j=0;j<2000;j++)
{ dc.MoveTo(B[j].Re,B[j].Im);
dc.LineTo(B[j+1].Re,B[j+1].Im);
}
fclose(file);
------解决思路----------------------
单步调试,设置断点来跟踪,一般都是指针操作问题
------解决思路----------------------
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
CRect rect;
float a[2000];
int i;
int j;
CString str;
FILE *file;
file =fopen("F:\\data2.txt","r");
for(i=0;i<2000;i++)
{
fscanf(file,"%f,",&a[i]);
}
//倒序的实现
int M =2048;
int NV2=M/2;
int NM1=M-1;
int I,J,K=0;
float T;
I=J=1;
while(I<=NM1)
{
if(I<J)
{
T = a[J-1];//将A[J-1]的内容和A[I-1]的内容互换,借助于中间变量T
a[J-1]=a[I-1];
a[I-1]=T;
}
K=NV2;
while(K<J)
{
J-=K;
K/=2;
}
J+=K;
I++;
}
//FFT
Complex U,W,V,B[2050];
int LE,LE1,IP;
int N=(int)pow(2,float (11));
{ for(i=0;i<2000;i++)
B[i].Re =a[i];
B[i].Im =0.0;
}
float L=1;
while(L<=11)
{
LE=(int)pow(2,L);
LE1=LE/2;
U.Re=1.0f;
U.Im=0.0f;
W.Re=(float)cos(PI/(1.0*LE1));//计算W算子的值
W.Im=(float)-1.0*sin(PI/(1.0*LE1));
if(abs(W.Re)<1.0e-12)
W.Re=0.0f;
if(abs(W.Im)<1.0e-12)
W.Im=0.0f;
J=1;
while(J<=LE1)
{
I=J;
while(I<=N)
{
IP=I+LE1;
V.Re=(float)B[IP-1].Re*U.Re-B[IP-1].Im*U.Im;//计算复数运算A*U
V.Im=(float)B[IP-1].Re*U.Im+B[IP-1].Im*U.Re;
B[IP-1].Re=(float)B[I-1].Re-V.Re;//计算复数运算A-T
B[IP-1].Im=(float)B[I-1].Im-V.Im;
B[I-1].Re+=V.Re;//计算复数运算A+T
B[I-1].Im+=V.Im;
I+=LE;
}
float temp=U.Re;
U.Re=(float)U.Re*W.Re-U.Im*W.Im;//计算复数运算U*W
U.Im=(float)temp*W.Im+U.Im*W.Re;
J++;
}
L++;
}
for(j=0;j<2000;j++)
{ dc.MoveTo(B[j].Re,B[j].Im);
dc.LineTo(B[j+1].Re,B[j+1].Im);
}
fclose(file);
------解决思路----------------------
单步调试,设置断点来跟踪,一般都是指针操作问题
------解决思路----------------------
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]
srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}