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->cout) shortestval。しかし、繰り返し、if(aretescan->cout <= shortestval)shortestval を = 858993460 に繰り返し取るように見えるか、if ステートメントに依存する操作に従って再割り当てするたびに非常に高い値に失敗すると、次の反復が来るまでにこの謎の値として読み続けられています。

私は完全に困惑しています。どんなアイデアでも心から感謝します。

4

2 に答える 2

1

shortestvalintではなく、宣言する必要があります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本当に がである場合は、ステートメントでorではなく、次のように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 に答える