问题出现在下面的变量shortestval中。它在下面声明并初始化(在1000处)。

ENSEMBLE Cscan = *C;
ENSEMBLE Vscan = *V;
int departnumero = Vscan->numero, arrivenumero = Cscan->numero, departshortest, arriveshortest;
double shortestval = 1000;
LISTE aretescan = NULL;

int x=0, y=0, z=0;

while( (*C) != NULL && iteration < 100){
iteration++;
departshortest = 99;
arriveshortest = 99;

printf("\n\n shortestval = %i", shortestval); // Check 1

while(Vscan != NULL && x < 100){
    printf("\n\n\t shortestval = %i", shortestval); // Check 2
    while(Cscan != NULL && y < 100){
        printf("\n\n\t\t shortestval = %i", shortestval);// Check 3
        aretescan = aretes[Vscan->numero];
        while(aretescan != NULL && z < 100){
            printf("\n\n\t\t\t shortestval = %i", shortestval);// Check 4
            if(aretescan->arrive == Cscan->numero){
                if(aretescan->cout <= shortestval){
                    printf("\n \t\t\t (%d < %d)", aretescan->cout, shortestval);

                    shortestval = aretescan->cout;
                    departshortest = aretescan->depart;
                    arriveshortest = aretescan->arrive;

                }
                printf("\nD - %d \tA - %d \tC - %d", aretescan->depart, aretescan->arrive, aretescan->cout);
                printf("\t\t\tD - %i, A - %i, C - %i", departshortest, arriveshortest, shortestval);
            }

            aretescan = aretescan->suiv;
            z++;
        }
        Cscan = Cscan->voisin;
        y++;
    }
    Vscan->voisin;
    x++;
}


但是,紧随其后的// Check 1处,打印的值为'0'。这一直持续到while(aretescan != NULL && z < 100)循环,在该循环中:

printf("\n \t\t\t (%d < %d)", aretescan->cout, shortestval);


在行之前为shortestval打印-858993460

printf("\t\t\tD - %i, A - %i, C - %i", departshortest, arriveshortest, shortestval);


在while循环的第一次迭代中输出5,这正是我期望的值(这是aretescan->cout设置为的shortestval的值)。但是反复地,在if(aretescan->cout <= shortestval)中似乎反复将最短时间设为= 858993460,或者由于每次迭代都根据依赖if语句的操作(但到下次迭代到来时,它将继续作为该神秘值读取。

我完全迷住了。任何想法将不胜感激。

最佳答案

需要将shortestval声明为int,而不是double。所有其他代码似乎都将其视为int。

编辑添加:


  printf("\n \t\t\t (%d < %d)", aretescan->cout, shortestval);打印为-858993640


-858993640 = 0xCCCCCCCC,这可能是运行时库用来填充未使用或未初始化的内存的内容;因此您可能无法正确初始化aretescan->cout

正如@Matts Petersson指出的那样,LISTE.cout可能是错误的数据类型。

我不知道aretescan = aretes[Vscan->numero];的定义就无法分辨LISTE的作用。

编辑添加:

如果aretescan->coutshortestval确实是double,则在%f语句中使用printf(),而不是%i%d

printf("\n \t\t\t (%f < %f)", aretescan->cout, shortestval);

关于c++ - 打印时声明和初始化的变量返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16724073/

10-09 09:02