我正在插入导致问题的代码片段。请关注未注释的代码,因为那是实际代码。注释掉的代码可以帮助我调试。对可读性差表示歉意,但我决定保留评论,以防有人怀疑我是如何得出我对问题的诊断的。
void backProp(double back_prop_err, double x[])// x is the complete output of input layer neurons.
{
//j++;
//printf("\nA"); printf("\nj=%d",j);
error = out*(1-out)*back_prop_err;
printf("\nB:%20.18f",error);
//if(j==8)
//{
// printf("\nstart= %d, stop= %d",start, stop);
// temp=1;
//}
for(int i=start; i<= stop; i++)
{
// if(i==24)
// break;
// if(temp==1)
// {
// printf("\nstart= %d and stop= %d", start, stop); //temp=0;
// }
//j++;
//printf("\nC");
del_w[i] = c*error*x[i];
printf("\ndel_w[%d]=%20.18f",i,del_w[i]);
}
}
请忽略注释掉的部分。他们在那里是为了在屏幕上显示东西,所以我可以调试代码。
问题:
有 3 个类,我们称它们为 A、B 和 C。A 有 24 个对象,存储为一个数组。B 有 10 个对象,同样在一个数组中,而 C 只有 1 个对象。
以上代码来自B类。
对于 B 类的 object[7],start 和 stop 的值(见上面的代码)分别是 0 和 23。我在运行时使用您在上面看到的注释掉的代码段验证了相同的内容。
然而,当调用 backProp 函数时,在那个特定的 for 循环中,进入了一个无限循环。i 的值不断增加,直到 DevC++ 崩溃。注释掉的 if(i==24) 被放在那里以防止这种情况发生。
这只发生在 B 类的对象 [7] 上...而不是前 7 个对象(对象 [0]...对象 [6])。对他们来说,该特定循环根据设置的“开始”和“停止”变量开始和停止。对于这些对象,“停止”是一个很小的数字(例如最多 6 或 12 个)重要吗?
B 类的 object[8] 和 object[9] 也有 stop = 23,这让我怀疑他们也会面临同样的问题。
问题:为什么会发生这种情况?设置启动和停止变量。为什么循环不保持在这些限制内?
我尽量保持简洁。感谢您阅读此问题墙的努力。
编辑: start 和 stop 是 B 类的私有变量(其中,上述函数是公共函数)。使用我从 main 调用的另一个公共函数将它们设置为各自的值。
j有点尴尬。它是一个全局静态整数,最初设置为 0。我这样做的原因是为了计算 B 类的 object[7] 何时访问 backProp 函数。每次调用 backProp 时 j 都会递增,并且由于它是静态全局的,因此它充当计数器,因此我可以计数直到对象 [7]。
根据 Oak 的建议,我将代码链接放在这里: http: //pastebin.com/ftxBGs2y
是的,正在努力学习 DevC++ 调试器。:P
我很确定我对 x 的尺寸没有任何问题。不过,我会再次调查此事。