0

问题出现在下面的变量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->coutshortestval。但反复地,if(aretescan->cout <= shortestval)似乎反复将 shortestval 设为 = 858993460,或者在每次迭代时未能达到非常高的值,因为它根据依赖于 if 语句的操作重新分配自己,但到下一次迭代到来时围绕它继续被解读为这个神秘的价值。

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

4

2 回答 2

1

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,则%fprintf()语句中使用,而不是%i%d

printf("\n \t\t\t (%f < %f)", aretescan->cout, shortestval);
于 2013-05-23T21:23:16.307 回答
0

这听起来像(a)一个记忆踩踏,(b)aretescan->cout不是一个%d。鉴于检查 1,它更有可能是 ENSEMBLE::operator=() 的一个损坏的实现。

ENSEMBLE Cscan = *C;
char _pad1[1024];
ENSEMBLE Vscan = *V;
char _pad2[1024];
int departnumero = Vscan->numero, arrivenumero = Cscan->numero, departshortest, arriveshortest;
char _pad3[1024];
int shortestval = 1000;
char _pad4[1024];
LISTE aretescan = NULL;
char _pad5[1024];

并更改检查 1

printf("\n\n shortestval = %u", shortestval); // Check 1
于 2013-05-24T02:20:10.027 回答