问题出现在下面的变量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语句的操作重新分配自身但是由下一次迭代到来的时间继续被视为这个神秘的价值。
我完全难过了。任何想法都会非常感激。
答案 0 :(得分: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->cout
和shortestval
确实是double
,请在%f
语句中使用printf()
,而不是%i
或%d
}:
printf("\n \t\t\t (%f < %f)", aretescan->cout, shortestval);
答案 1 :(得分:0)
这听起来像是(a)记忆踩踏,(b)aretescan-&gt; 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