Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 我有一个for循环,它拒绝停留在定义的限制内。已在运行期间(通过打印)验证限制_Arrays_Oop_Debugging_For Loop_Dev C++ - Fatal编程技术网

Arrays 我有一个for循环,它拒绝停留在定义的限制内。已在运行期间(通过打印)验证限制

Arrays 我有一个for循环,它拒绝停留在定义的限制内。已在运行期间(通过打印)验证限制,arrays,oop,debugging,for-loop,dev-c++,Arrays,Oop,Debugging,For Loop,Dev C++,我正在插入导致问题的代码片段。请关注未注释的代码,因为这是实际的代码。注释掉的代码是用来帮助我调试的。很抱歉可读性差,但我决定保留这些评论,以防有人怀疑我是如何得出问题诊断的 void backProp(double back_prop_err, double x[])// x is the complete output of input layer neurons. { //j++; //printf("\nA"); printf("\nj=%d",j

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

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类的对象[7],start和stop see上述代码的值分别为0和23。我已经在运行时使用您在上面看到的注释掉的代码片段验证了这一点

然而,当调用backProp函数时,在特定的for循环中,将进入一个无限循环。i的值不受限制地不断增加,直到DevC++崩溃。注释掉的ifi==24放在那里是为了防止出现这种情况

这只发生在类B的对象[7]上。。。不适用于前7个对象对象[0]…对象[6]。对于他们来说,特定的循环根据设置的开始和停止变量开始和停止。对于这些对象,“停止”是一个小数字,如最大6或12,这是否重要

类B的对象[8]和对象[9]也有stop=23,这让我怀疑它们也会面临同样的问题

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]);
        }
    }
问题是:为什么会发生这种情况?设置启动和停止变量。为什么循环不在这些限制范围内

我已尽力使这一点尽可能简洁。感谢您在阅读这道题墙时所做的努力

编辑:开始和停止是B类的私有变量,其中,上述函数是一个公共函数。它们使用另一个公共函数设置为各自的值,我从main调用该函数

j有点尴尬。它是一个全局静态整数,最初设置为0。我这样做的原因是为了计算类B的对象[7]何时访问backProp函数。每次调用backProp时,j都会递增,因为它是一个静态全局变量,它充当计数器,所以我可以一直计数到对象[7]

根据Oak的建议,我在这里为代码建立了链接:

是的,我们正在努力学习DevC++调试器P


我很确定我对x的维数没有任何问题。不过,我会再次调查此事。

我敢打赌,在将元素写入del_w[]时,您无意中修改了I:可能数组中的元素数量不够大,无法满足您的要求

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

仔细检查数组的边界,记住它们是基于零的

在for循环中不会有任何有趣的事情;你可以信任编译器


但是,请使用一个好的调试器,否则您将浪费大量时间。

我保证诸如的基本功能不会被破坏。这意味着您的代码是错误的,而不是错误的。在任何情况下,最好在代码上使用调试器来解决此问题—一个真正的调试器,而不是像visual studio中那样的打印语句。然后,您可以查看堆栈跟踪、所有值,并查看它们来自何处,并进行适当的调查。如果您打印开始和停止,并看到良好的值,然后您陷入循环中,那么这些值在打印点之后一定发生了什么事-例如,也许是另一个线程改变了它们——它们毕竟是字段,而不是本地字段。如果有的话,试着从循环内部打印它们的值,或者更好,在执行过程中使用调试器查看它们的值。@Oak,我这样做了。它在for循环外部为start和stop打印0和23,并从for循环内部打印相同的值。for循环中代码的注释掉部分就是这样做的。我现在只有DEV C++,我无法理解如何使用它的调试器。正在尝试获取Visual Studio的代码块。恐怕我不了解田野和当地人。感谢您的帮助。局部变量是函数的局部变量,如x和i,而字段是属于对象的变量,如j和start。事实上,您是否介意编辑您的问题,将j、start和stop的定义包括在内?@Oak,谢谢您的澄清。我已经编辑了我的问题。因为我的开始和停止变量是私有的,所以我应该只能通过使用同一类的成员函数来更改它们。我的代码中没有使用继承的概念,因此这不是一个复杂的因素。我只设置启动和停止一次的值,u
唱一个班级的成员函数,分别为0和23。我是个白痴。正如芭丝谢芭预测的那样。这是del_w声明的一个错误。我把它定义为20个元素的数组,当我试图访问23个元素时。。。现在,代码起作用了…:我很好奇,尽管试图访问delu w定义范围之外的元素会如何影响I的值?我怀疑这与机器的内部结构有关,但是C++代码是编译的吗?我能深入了解一下吗?在类似c语言中,所有数组都是指针。使用指针,您可以访问操作系统为您的程序提供的任何内存:数组没有什么不同。是的。。。所以,如果我定义del_w[20],然后尝试访问del_w[21],我基本上是跳转到一段代码&del_w+21?当我试图改变它时,for循环的条件检查不知怎么地被停用了。。。谢谢帮助如果定义del_w[20],则只能安全访问del_w[0]到del_w[19]!!数组是基于零的。