0

我正在插入导致问题的代码片段。请关注未注释的代码,因为那是实际代码。注释掉的代码可以帮助我调试。对可读性差表示歉意,但我决定保留评论,以防有人怀疑我是如何得出我对问题的诊断的。

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 的尺寸没有任何问题。不过,我会再次调查此事。

4

1 回答 1

2

我敢打赌,您在将元素写入 del_w[] 时无意中修改了 i:也许数组中的元素数量不足以满足您的操作。

我这样说是因为 i 和 del_w 在堆栈上可能彼此靠近,但不确定,因为我不知道您如何为 del_w 分配内存。

仔细检查数组的边界,记住它们是从零开始的。

在 for 循环中不会有什么好笑的;你可以相信编译器!

但是尽管使用一个好的调试器,否则你会浪费很多时间。

于 2013-05-19T14:43:29.553 回答