[转帖]获得ET_LOAD_STORE,内存访问异常。
我是新手,我尝试在startkit中运行T递归阶乘的代码,一段时间后,我得到 "Program received signal ET_LOAD_STORE, Memory access exception.".
我认为是单片机似乎只支持64位和无法保持对于阶乘50号,但我不知道。
这是我的代码。
int factorial(int n)
{
if(n!=1)
return n*factorial(n-1);
return 1;
}
int main()
{
uint64_t i;
int value[37]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,50,70,100,450,1000,3249,10000,25206,100000,205023,1000000,1723508,2000000,10000000,14842907};
for (i=1; i <=value[i]; i++)
{
printf("Factorial of %d is %lu\n",value[i],factorial(value[i]));
}
return 0;
}
回答:
回复:
我怀疑的加载/存储异常的原因是一个堆栈溢出。由于阶乘()是递归的,将使用的内存至少一个字(4字节)每次调用它自身的时间。对于较大的n堆栈溢出的可用内存量,并开始覆盖方案,在这一点什么事情都可能发生(包括加载/存储除外)。用阶乘的非递推版本应该解决这个问题:
int factorial(int n)
{
int result = 1;
while (n > 1) {
result *= n;
--n;
}
return result;
}
如果你解决了堆栈溢出,你会得到一个数组边界异常(ET_ECALL)。这是因为下面的for循环的退出条件将永远不会被满足:
for (i=1; i <=value[i]; i++) {
...
}
因此我将继续递增,直到它等于值阵列(37)此时表达式的值的大小[37]将出界和运行时将引发异常。可以通过将其更改为改变循环的退出条件,例如固定的:
for (i=1; i <37; i++) {
...
}
一旦你做了这个改变你的程序应该运行到完成,但对n的值很大,你仍然不会得到正确的结果。阶乘函数接受一个int参数的上xCORE为32位宽。如果n!不适合在一个32位的值,则阶乘函数内部的乘法会溢出。这不会导致异常,但阶乘()的结果将不匹配因子的数学值,由于这种溢出。
发表时间:2014年8月31日10:45:31