迭代会导致崩溃

时间:2018-04-20 22:59:37

标签: c++ c

这次迭代有什么问题? 这段特殊的代码导致我的程序崩溃。当我禁用代码时,它可以工作,但当然会给出错误的结果。它应该将sigmasigma_last进行比较,直到它们在e-14保持相等为止。

这是我先试过的:

long double sigma_last = NULL;

       do{
         if(sigma_last != NULL){
            sigma = sigma_last;
         }
         sigma1 = atan( tan(beta1) / cos(A1) );
         sigmaM = (2*sigma1 + sigma) / 2;

         d_sigma = B*sin(sigma)*(cos(2*sigmaM)+(1/4)*B*(cos(sigma)
                         *(-1+2*pow(cos(2*sigmaM),2)))-(1/6)*B*cos(2*sigmaM)
                         *(-3+4*pow(sin(sigma),2))*(-3+4*pow(cos(2*sigmaM),2)));
         sigma_last = sigma + d_sigma;
       }
       while(set_precision_14(sigma)<= set_precision_14(sigma_last) || set_precision_14(sigma)>= set_precision_14(sigma_last));

然后我尝试使用指针(绝望地):

long double *sigma_last;
*sigma_last = NULL;
   do{
      if(*sigma_last != NULL){
        sigma = *sigma_last;
     }
     sigma1 = atan( tan(beta1) / cos(A1) );
     sigmaM = (2*sigma1 + sigma) / 2;

     d_sigma = B*sin(sigma)*(cos(2*sigmaM)+(1/4)*B*(cos(sigma)
                     *(-1+2*pow(cos(2*sigmaM),2)))-(1/6)*B*cos(2*sigmaM)
                     *(-3+4*pow(sin(sigma),2))*(-3+4*pow(cos(2*sigmaM),2)));
     *sigma_last = sigma + d_sigma;
   }
   while(set_precision_14(sigma)<= set_precision_14(*sigma_last) || set_precision_14(sigma)>= set_precision_14(*sigma_last));

找出整个代码中的错误来源并尝试解决它花了我几个小时,不能真正想出另一个&#34;也许这个?&#34; 。随意打我。

如果有人感兴趣的话,这里是我full code的github链接。

2 个答案:

答案 0 :(得分:2)

您的第一次(也是唯一的)迭代,sigma_last将为null,从而导致崩溃:

*sigma_last = NULL; // <-- dereferencing uninitialized ptr here
if(*sigma_last != NULL) { // <-- dereferencing uninitialized ptr here too

如果可以修复,请点击这里:

*sigma_last == sigma + d_sigma;

这是因为您没有将sigma_last设置为指向内存中的某个有效浮点空间。在这种特殊情况下使用指针似乎没有任何意义,所以如果我是你,我会放弃它并使用正常long double,就像你第一次尝试一样。

在第一个示例中,您将NULL(实际上为零值)分配给sigma_last。如果零不是您想要的,那么您可以选择一个肯定会超出范围的值(比如1e20然后比较说< 1e19)或保持单独的boolan为了工作。我个人更喜欢第一种选择:

long double sigma_last = 1e20;
...
if(sigma_last < 1e19){
    sigma = sigma_last;
}

更好的方法仍然是使用无限或有限的循环,然后在某种条件下爆发。这将使代码更易于阅读。

逻辑

最后,您似乎在while中遇到了逻辑问题,因为比较sigma <= sigma_last || sigma >= sigma_last 总是为真。它总是更小,更大或更平等。

答案 1 :(得分:1)

sigma_last不需要是指针。你只需要以某种方式标记其值以知道它是否已经设置。从你的代码我不确定我们是否可以为此目的使用零,但我们可以使用一些常量(long double minimum value),如下所示:

import {goBack} from 'react-router-redux';


//in reducer
return loop(
   state.updateIn(['users', action.payload.id], user => user.merge(fromJS(action.payload.user))),
   Effects.constant(goBack())
);

试试这个:

#include <float.h>
const long double invalid_constant = LDBL_MIN;