问题出现在下面的变量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
打印-858993460printf("\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->cout
和shortestval
确实是double
,则在%f
语句中使用printf()
,而不是%i
或%d
:
printf("\n \t\t\t (%f < %f)", aretescan->cout, shortestval);
关于c++ - 打印时声明和初始化的变量返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16724073/