Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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/c/69.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
C++ 调用函数会给出两个不同的输出值_C++_C - Fatal编程技术网

C++ 调用函数会给出两个不同的输出值

C++ 调用函数会给出两个不同的输出值,c++,c,C++,C,这几天我一直很困惑。我对C有点陌生,但我通常可以通过谷歌搜索解决问题,但这让我感到困惑。我问过一些人,他们没能帮我 问题是,当我在代码(48和49)中包含我标记的行时,f1计算的输出与output2不同,即使它们在数学上应该相同。然而,如果我用另一种方式来称呼它,那么我就没有这个问题。我在Ubuntu12.04上用gcc或g++编译(两者都有相同的问题) 我还将代码上传到了。有关问题,请参见第48行和第49行 提前感谢你的帮助 #include <stdio.h> #include

这几天我一直很困惑。我对C有点陌生,但我通常可以通过谷歌搜索解决问题,但这让我感到困惑。我问过一些人,他们没能帮我

问题是,当我在代码(48和49)中包含我标记的行时,f1计算的输出与output2不同,即使它们在数学上应该相同。然而,如果我用另一种方式来称呼它,那么我就没有这个问题。我在Ubuntu12.04上用gcc或g++编译(两者都有相同的问题)

我还将代码上传到了。有关问题,请参见第48行和第49行

提前感谢你的帮助

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PARAMETER1 100
#define nx1 5
#define nx2 10
#define nx3 10
#define ny1 4
#define ny2 5
#define ny3 10
#define Nx nx1+nx2+nx3+1
#define Ny ny1+ny2+ny3+1
#define X1_LENGTH 5.0     
#define X2_LENGTH 10.0
#define X3_LENGTH 50.0
#define Y1_LENGTH 0.04
#define Y2_LENGTH 5.0
#define Y3_LENGTH 20.0

double f(int j,int i);
double g(int j,int i);
double dx(int i);
double calc_value_pos(int i);
double calc_value_neg(int i);
double **matrix;
double f1(int j,int i);
double calc_value2_pos(int i);
double calc_value2_neg(int i);
double f2(int j,int i);

int main(void){

    matrix=(double **)malloc((size_t) ((Ny+1)*(Nx+1)+1)*sizeof(double * ));
    for (int j=1; j<=(Ny+1)*(Nx+1); j++) {
        matrix[j] = (double *)malloc((size_t) ((Ny+1)*(Nx+1)+1)*        sizeof(double ));
    }

    for (int j=1; j<=Ny+1; j++){
        for (int i=1; i<=Nx+1; i++){
            matrix[j][i]=0.0;
        }
    }

    for (int i=0; i<=Nx; i++){
        for (int j=0; j<=Ny; j++){
            int k=i+(j)*(Nx+1)+1;
            matrix[k][k] = f(j,i);      /*including this line causes the problem*/
            //matrix[k][k] = f1(j,i);     /* including this line does not cause the problem*/
        }
    }
    return 1;
}

double f(int j, int i){
    double output=f1(j,i)+f2(j,i);
    return output;
}
double f1(int j, int i){
    double output;
    if (i==0 || j==0 || i==Nx || j==Ny) output=0.0;
    if (i!=0 && j!= 0 && i!= Nx && j!=Ny) {
        output = (g(j,i)*g(j,i+1))/(g(j,i)*calc_value_pos(i)+g(j,i+1)*calc_value_neg(i));
        double output2;
        output2=1.0/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
        /*if (output2!=output2) printf("output2: %lf\n",output2);*/
        if (output != output2 && output==output) printf("(j%d,i%d) output:%lf \toutput2:%lf\n",j,i,output,output2);
    }
    if (output!=output) output=0.0;
    return output;
}

double f2(int j,int i){
    /* calculates f2 for (j,i) */
    double output;
    if (j==0 || i==0) output=0.0;
    else output = g(j,i)*g(j,i-1)/(g(j,i)*calc_value2_neg(i)+g(j,i-1)*calc_value2_pos(i));
    if (output!=output) output=0.0;
    return output;
}

double calc_value2_pos(int i){
    /* calculates calc_value2_pos for X=i */
    double output= dx(i)/2.0;
    return output;
}

double calc_value2_neg(int i){
    /* calculates calc_value2_neg for X=i */
    if (i==0) printf("Warning off grid\n");
    double output= dx(i-1)/2.0;
    return output;
}

double g(int j,int i){
    double output=PARAMETER1;
    if (j==0 || i==0) output=0.0;
    if (j>=ny1+1 && j<=ny1+ny2 && i>=1 && i<=nx1) output=0.0;
    if (output!=output) printf("calc_D(%d,%d) error: output==nan\n",j,i);
    return output;
}

double calc_value_pos(int i){
    if (i==Nx) printf("Warning east pos\n");
    double output;
    output = dx(i+1)/2.0;
    if (output!=output) printf("calc_delta_e_pos(%d) error: output==nan\n",i);
    return output;
}

double calc_value_neg(int i){
    double output=dx(i)/2.0;
    if (output!=output) printf("calc_delta_e_neg(%d) error: output==nan\n",i);
    return output;
}

double dx(int i){
    double output;
    if (i<=nx1) output=1.0*X1_LENGTH/nx1;
    if (i<=nx1+nx2 && i>=nx1+1) output=1.0*X2_LENGTH/nx2;
    if (i<=nx1+nx2+nx3 && i>=nx1+nx2+1) output=1.0*X3_LENGTH/nx3;
    if (output!=output) printf("delta_x(%d) error: output==nan\n",i);
    return output;
}
#包括
#包括
#包括
#定义参数1100
#定义nx1 5
#定义nx2 10
#定义nx3 10
#定义NY14
#定义ny2 5
#定义ny3 10
#定义Nx nx1+nx2+nx3+1
#定义ny1+ny2+ny3+1
#定义X1_长度5.0
#定义X2_长度10.0
#定义X3_长度50.0
#定义Y1_长度0.04
#定义Y2_长度5.0
#定义Y3_长度20.0
双f(int j,int i);
双g(int j,int i);
双dx(inti);
双计算值位置(int i);
双计算值负(整数i);
双**矩阵;
双f1(整数j,整数i);
双计算值2位置(int i);
双计算值2负(整数i);
双f2(int j,int i);
内部主(空){
矩阵=(double**)malloc((size_t)((Ny+1)*(Nx+1)+1)*sizeof(double*);

对于(int j=1;j来说,很难理解这段代码在做什么,但是:

output = (g(j,i)*g(j,i+1)) / (g(j,i)*calc_value_pos(i)+g(j,i+1)*calc_value_neg(i));
output2= 1.0/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
我很清楚为什么它们在数学上应该是相似的。 从
output2

1.0/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
所以我们交叉相乘得到一个公分母:

1.0/ ((g(j,i+1)*(calc_value_neg(i)) + (g(j,i)*(calc_value_pos(i)))/(g(j,i)*g(j,i+1))
1.0除以一个分数等于该分数的倒数:

g(j,i)*g(j,i+1) / (g(j,i+1)*calc_value_neg(i) + g(j,i)*(calc_value_pos(i)) )
这与您的输出完全相同:

g(j,i)*g(j,i+1) / (g(j,i)*calc_value_pos(i) + g(j,i+1)*calc_value_neg(i) )
因此,错误不在于如何表示代码,而是发生在计算本身的某个地方。我无法将整个代码块放入我的头脑中进行调试,但从表面上看,有两件事情跳了出来:

  • f2中的g(j,i-1)
  • f()
  • 在进行计算之前,您是否尝试过将1.0直接转换为双精度?我以前遇到过一些问题(虽然不是在C中),我编写了类似于1.0的代码,编译器将其视为浮点而不是双精度,然后在转换为双精度之前进行计算,我得到一个舍入错误

    试着把这个扔进去:

    double one_d = 1.0;
    output2= one_d/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
    

    只是一个玩笑,对不起,我没有更好的主意。

    很难理解这段代码在做什么,但是:

    output = (g(j,i)*g(j,i+1)) / (g(j,i)*calc_value_pos(i)+g(j,i+1)*calc_value_neg(i));
    output2= 1.0/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
    
    我很清楚为什么它们在数学上应该是相似的。 从
    output2

    1.0/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
    
    所以我们交叉相乘得到一个公分母:

    1.0/ ((g(j,i+1)*(calc_value_neg(i)) + (g(j,i)*(calc_value_pos(i)))/(g(j,i)*g(j,i+1))
    
    1.0除以一个分数等于该分数的倒数:

    g(j,i)*g(j,i+1) / (g(j,i+1)*calc_value_neg(i) + g(j,i)*(calc_value_pos(i)) )
    
    这与您的输出完全相同:

    g(j,i)*g(j,i+1) / (g(j,i)*calc_value_pos(i) + g(j,i+1)*calc_value_neg(i) )
    
    因此,错误不在于如何表示代码,而是发生在计算本身的某个地方。我无法将整个代码块放入我的头脑中进行调试,但从表面上看,有两件事情跳了出来:

  • f2中的g(j,i-1)
  • f()
  • 在进行计算之前,您是否尝试过将1.0直接转换为双精度?我以前遇到过一些问题(虽然不是在C中),我编写了类似于1.0的代码,编译器将其视为浮点而不是双精度,然后在转换为双精度之前进行计算,我得到一个舍入错误

    试着把这个扔进去:

    double one_d = 1.0;
    output2= one_d/( (calc_value_neg(i)/g(j,i)) + (calc_value_pos(i)/g(j,i+1)));
    

    只是一只百灵鸟,对不起,我没有更好的主意。

    计算值位置中,对于
    I==25
    ,您可以调用
    dx(26)

    double dx(int i){
    双输出;
    
    如果(i nx1+nx2+nx3
    ,则返回未初始化的变量,这意味着未定义的行为。

    计算值位置
    中,对于
    i==25
    ,调用
    dx(26)

    double dx(int i){
    双输出;
    

    如果(i nx1+nx2+nx3),因此返回未初始化的变量,即未定义的行为。< /p>是否有任何原因标记为C++?在重要的情况下,您使用C还是C++编译器?我尝试使用C和C++两种方式,这就是为什么我在C++中标记它的问题是F1根据调用的位置产生2种不同的输出。预计起飞时间from@Ben不,它是不确定的行为,编译器可以做任何它想要的。这有什么原因是C++的?如果有问题,你是使用C还是C++编译器?我试着使用C和C++两种方式,这就是为什么我在C++中加上标签的原因是F1产生了2种不同的输出,这取决于它的调用位置。from@Ben不,它是未定义的在这种情况下,编译器可以做它想做的任何事情。问题不是f1!=f。问题是输出!=output2。我不明白为什么会发生这种情况,这取决于我如何调用它。当f1从f中调用时,输出!=output2。当f从主输出调用时==output2。这样做解决了我的问题,即使我将它设置为output3(那时我将你发布的内容设置为output3,output==output2。你知道为什么会发生这种情况吗?我理解为什么如果1.0不能正确转换,它会给出错误的值,但为什么当所有的数学都用双精度进行计算时,它会结转到输出?@Ben:使用
    1.0d
    强制文字为
    double
    ,所以你可以尝试使用它,而不是引入另一个变量。@icktoofay使用1.0d时,我仍然得到output=40.0,output2=20.0问题不是f1!=f。问题是output!=output2。我不明白为什么会发生这种情况,这取决于我如何调用它。当从f中调用f1时,则得到output!=output2。当从主输出调用f时,则得到output==output2.这样做解决了我的问题,即使我将它设置为output3(即w)