Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

29.12.2006, 22:26

Falscher do/while-Schleifendurchlauf!

Hallo zusammen,

analog zu meinem letzten Thread jetzt ein neues Problem. Diesmal handelt es sich um eine do-while-Schleife, die nicht macht was sie soll.

Obwohl die Variable do_again auf FALSE steht (laut Debugger [in der Debugversion ;) ]) wird die Schliefe nicht verlassen, sondern nochmals ausgeführt, anstatt wieder mit der for-Schleife weiter zu machen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
for(int x = 0 ; x < FIELD_COUNT_X ; x++)
    for(int y = 0 ; y < FIELD_COUNT_Y ; y++)
    {       
        do
        {
            int temp_number = rand()%PAIR_COUNT;

            switch(set_array[temp_number][1])
            {
            case SET_ZERO:
                {
                    placement[x][y].bitmap_number = temp_number;
                    placement[x][y].set = TRUE;

                    set_array[temp_number][1] = SET_ONCE;

                    do_again = FALSE; 
                }break;

            case SET_ONCE:
                {
                    placement[x][y].bitmap_number = temp_number;
                    placement[x][y].set = TRUE;

                    set_array[temp_number][1] = SET_DOUBLE;

                    do_again = FALSE;
                }break;

            case SET_DOUBLE:
                {
                    do_again = TRUE;
                }break;

            default:
                {
                    MessageBoxW(hwnd,L"Fehler in set_array",L"Error",0);
                }break;
                    
            }

        } while (do_again == TRUE);     


Die Variable ist als FALSE initialisiert und kann beim ersten Durchlauf der do-while-Schleife eigentlich gar nicht auf TRUE umgesetzt werden, da der case-Zweig "case SET_DOUBLE:" beim ersten Durchlauf nicht eintreffen kann!

2

29.12.2006, 22:53

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
for (unsigned int x = 0; x < FIELD_COUNT_X; ++x)
    {
        for (unsigned int y = 0; y < FIELD_COUNT_Y; ++y)
        { 
            bool bAgain = true;
            while (bAgain != false)
            {
                int nTempNumber = rand() % PAIR_COUNT + 1;

                switch (set_array[nTempNumber][1])
                {
                case SET_ZERO:
                    {
                        placement[x][y].bitmap_number   = nTempNumber;
                        placement[x][y].set             = true;

                        set_array[nTempNumber][1]       = SET_ONCE;

                        bAgain = false;
                    } break;
                case SET_ONCE:
                    {
                        placement[x][y].bitmap_number   = nTempNumber;
                        placement[x][y].set             = true;

                        set_array[temp_number][1]       = SET_DOUBLE;

                        bAgain                          = false;
                    }break;

                case SET_DOUBLE:
                    {
                        bAgain                          = true;
                    }break;
                default:
                    {
                        MessageBox(hWnd, _T("Fehler in set_array"), NULL, MB_OK | MB_ICONERROR);
                    }break;
                }
            }
        }
    }

Schließ mal alle Klammern ... so ist es relativ unübersichtlich.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

29.12.2006, 23:11

Sorry, aber deine Variante geht net, anscheinend wegen dem while ohne do (also der Compiler motzt net, aber das Programm geht dann ansich nicht mehr, vermutlich, weil dann diese Funktion nicht mehr des macht, was sie soll).

Ist aber nicht ganz so wichtig, da ich gerade gemerkt haber, dass es jetzt fast geht. Muss jetzt nochmal schauen. Trotzdem danke. Allein schon deine Namenskonvetionen haben zur beseren Lesbarkeit meines Codes (v.a. dieser Funktion) beigetragen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

30.12.2006, 09:51

Zitat von »"Deviloper"«


C-/C++-Quelltext

1
while (bAgain != false)



;-)

@spacegaier: Nur als kleine Anmerkung. Zufallszahlen per rand() und Modulo generieren sollte vermieden werden. Es gibt nicht umsonst eine Definition mit Namen RAND_MAX.

grüße
@D13_Dreinig

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

5

30.12.2006, 10:03

Okay, spacegaier, jetzt wollen wir alle von dir hören, was genau der Unterschied zwischen einer "while { ... }" und einer "do { ... } while ()" Schleife ist (und wie man die zweite Form in die erste überführt).

Die Version von Deviloper macht eigentlich das gleiche, wie deine Version (bis auf einen kleinen Fehler, s.u.).

Der wesentliche Unterschied zu deiner Version ist, dass die Abbruchvariable bAgain in Devilopers Code in der innersten Schleife jedesmal neu mit false"initialisiert wird.

In deiner Version behält die "do_again" Variable ihren Wert auch dann, wenn die for-Schleife das zweite Mal durchlaufen wird.

Ein zweiter Unterschied (und vermutlich der kleine Fehler) ist die Berechnung der temp_number. Modulo PAIR_COUNT zu rechnen ist natürlich korrekt, solange das die Anzahl und nicht der letzte gültige Index ist. Deviloper hat das (ausversehen :)) noch eine 1 draufgerechnet, was (unabhängig von der Reihenfolge der Operatoren, die muss ich auch immer erst nachschlagen ;)) vermutlich keine gute Idee ist.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige