这次迭代有什么问题?
这段特殊的代码导致我的程序崩溃。当我禁用代码时,它可以工作,但当然会给出错误的结果。它应该将sigma
与sigma_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链接。
答案 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;