wince6.0中 出现Exception 'Prefetch Abort'错误,高手指点
我在一个流驱动中专门处理算法,在算法中会有大量数据的处理过程,在算法处理过程中出现以下报错:Exception 'Prefetch Abort' (3): Thread-Id=078e000e(pth=89cd7000), Proc-Id=0670000e(pprc=89c5d348) 'edm.exe', VM-active=0670000e(pprc=89c5d348) 'edm.exe'
PC=3783461f(???+0x3783461f) RA=3783461f(???+0x3783461f) SP=d462fd68, BVA=3783461e
Exception 'Data Abort'(4) Thread-Id=012c000a(pth=8fb9bae0) PC=80147288 BVA=37884656, dwInfo = 00000001
R0=00000000 R1=0000fffc R2=6000001f R3=ffffc800
R4=d29dfc44 R5=8fb9bae0 R6=00000000 R7=00000000
R8=00000002 R9=00000000 R10=00000000 R11=d29dfe2c
R12=80147288 SP=d29dfc2c Lr=80147288 Psr=6000001f
我已经定位到了报错的地方,是两个float类型数相乘时出现这个错误,如下的情形:#define N 760
float f[N],g[N],h[N];
for(int i=0;i<N;i++)
{
h[i]=f[i]*g[i];
}
其中f[N],g[N]是在此运算之前被正确计算出来的值
整个算法在vs2005的winn32工程里可正常运行,放到驱动里编译无错误,打包到系统里下到开发板上,被调用时就会报这种错误,请问怎么解决?
[解决办法]
区别1 double 占8个字节,float 占4个字节。
区别2 精度不同:float4个字节;而double8个字节;
区别3 float应该加注F,否则系统会自动转换为double。
由上面可知,如果楼主认为是类型问题,那么h定义为double应该可以解决问题。
但是我实际中验证:
float a;
float b;
float d;
double c;
a=3.402823466e+38F;
b=3.402823466e+38F;
d=a*b;
c=a*b;
超过范围的a,b相乘d,c会得到1.#INF这样一个溢出值,根本不会报异常。
根据个人经验,报错类型主要是指针错误的居多,1楼说的对,但3楼说的问题个人也碰到过,楼主的错可能倾向这里,申请足够大的数组会导致栈溢出,出现未知道的错误,这个楼主可以验证,把N值放大
所以我建议楼主,先按4楼说的方法用堆来存储你的值,然后三个值都改回浮点型。如果程序没有报异常了,那证明确实是栈空间不足了。即使楼主现在用double勉强没报错了,但是芨芨可危的栈空间随时会在其它程序中暴露出来,到时想查都无从查起了