# Mehre While-Schleifen hintereinander



## idaho369 (19. Sep 2016)

Hallo,

ich habe ein (Greenfoot) Programm (das Klavier), dass einfach mit einer for Schleife geht. Es geht darum, weisse und schwarze Tasten anzeigen zu lassen. Hierfür kann man bequem beide for Schleifen hintereinander laufen lassen.

Ich möchte das Programm nun abändern und mit ein oder zwei while Schleifen anzeigen lassen. Leider geht das nicht. Es werden nur die weissen Tasten angezeigt, die schwarzen werden übersprungen. Wenn ich den ersten Block lösche, werden die schwarzen Tasten angezeigt. Habe ich einen logischen Fehler? Ja, er muss logisch sein, denn das Programm kompiliert. Sehr dankbar über den entscheidenen Tipp. Der Fehler kann nur in diesem Block liegen. Da er nach der Abwandlung der for in die while schleife aufgetaucht ist.Hier der Code:




```
/**
     * Create the piano keys (white and black) and place them in the world.
     */
    private void makeKeys()
    {
        int i =0;
        while ( i < whiteKeys.length) {
            Key key = new Key(whiteKeys[i], whiteNotes[i]+".wav", "white-key.png", "white-key-down.png");
            addObject(key, i*63 + 54, 140);
           i = i+1;
        }

        // make the black keys
        while( i < blackKeys.length) {
            if( ! blackKeys[I].equals("") ) {
                Key key = new Key(blackKeys[i], blackNotes[i]+".wav", "black-key.png", "black-key-down.png");
                addObject(key, i*63 + 85, 86);
                i=i+1;
            }
        }
    }
```


----------



## dayaftereh (19. Sep 2016)

Pack bitte deinen Code in einen Codeblock, dann kann man ihn besser lesen!


----------



## idaho369 (19. Sep 2016)




----------



## stg (19. Sep 2016)

Die zweite while-Schleife wird nie betreten. 
Nach dem Durchlauf der ersten Schleife hat i den Wert i=whiteKeys.length. 
Da vermutlich blackKeys.length kleiner ist als whiteKeys.length ist die Bedingung i<blackKeys.length an dieser Stelle nie erfüllt.
Nimm eine andere Zählvariable, oder setze i wieder auf 0 (oder welcher Wert sonst sinnvoll ist)


----------



## Flown (19. Sep 2016)

CodeTags werden hier im Forum so geschrieben: [code=java]//JAVA CODE[/code]


----------



## idaho369 (19. Sep 2016)

Erstmal vielen Dank fuer das Anschauen des codes. Wenn ich nocheinmal i nehme, dann erscheint die Fehlermeldung, dass i bereits existiert. Waehle ich eine andere Zaehlvariable, dann kompiliert das Programm natuerlich. Die Tasten sind aber nach wie vor weiss.


----------



## VfL_Freak (19. Sep 2016)

idaho369 hat gesagt.:


> Wenn ich nocheinmal i nehme, dann erscheint die Fehlermeldung, dass i bereits existiert.


Ich rate jetzt mal ins Blaue, da du keinen Code gepostet hast 
Du darfst die Variable natürlich nicht neu deklarieren, sondern sollst die Vorhandene auf 0 setzen ....

Poste am besten mal den gesamten aktuellen Code ... diese Rumraterei führt doch zu nix!! 

Gruß Klaus


----------



## idaho369 (19. Sep 2016)

```
/**
     * Create the piano keys and place them in the world.
     */
    private void makeKeys()
    {
        int i = 0;
        while (i < whiteKeys.length)
        {
            Key key = new Key(whiteKeys[i], whiteNotes[i] + ".wav", "white-key.png", "white-key-down.png");
            addObject(key, i*63 + 54, 140);
            i = i + 1;
        }
        int i = 0;// hier kommt der Compilierfehler
        while (i < blackKeys.length)
       
        {
            if(!blackKeys[i].equals(""))
            {
                Key key = new Key(blackKeys[i], blackNotes[i] + ".wav", "black-key.png", "black-key-down.png");
                addObject(key, i*63 + 85, 86);
                i++;
            }
        }
       
    }
```


----------



## idaho369 (19. Sep 2016)

Sorry, ich bin das erste Mal in dem Forum und suche gerade noch den Codeblock, damit der Code so schoen aussieht, wie bei mir


----------



## Joose (19. Sep 2016)

idaho369 hat gesagt.:


> Sorry, ich bin das erste Mal in dem Forum und suche gerade noch den Codeblock, damit der Code so schoen aussieht, wie bei mir


Einfach [code=java] ... dein code ... [/code] schreiben 

Zu deinem Problem: VfL_Freak hat es doch schon gesagt. Du deklarierst im selben Scope die gleiche Variable nochmal (in diesem Fall "i"), das darf man nicht. Stattdessen solltest du die Variable "i" doch einfach auf 0 setzen.


----------



## VfL_Freak (19. Sep 2016)

oder ganz platt gesagt:

```
int i = 0;// hier kommt der Compilierfehler
```
Lass hier das _*int*_ weg .....


----------



## idaho369 (19. Sep 2016)

Erstmal vielen Dank fuer Eure Hilfe. Ich teste jetzt gleich den codeblock) Leider klappt das i=0 nicht. Es kommt der Hinweis auf eine eventuelle unendliche Schleife. Hier der Code

```
private void makeKeys() 
    {
        int i = 0;
        while (i < whiteKeys.length) 
        {
            Key key = new Key(whiteKeys[i], whiteNotes[i] + ".wav", "white-key.png", "white-key-down.png");
            addObject(key, i*63 + 54, 140);
            i = i + 1;
        }
       i = 0;
        while (i < blackKeys.length)
       
        {
            if(!blackKeys[i].equals(""))
            {
                Key key = new Key(blackKeys[i], blackNotes[i] + ".wav", "black-key.png", "black-key-down.png");
                addObject(key, i*63 + 85, 86);
                i++;
            }
        }
       
    }
```
Gruesse, Isa


----------



## Meniskusschaden (19. Sep 2016)

idaho369 hat gesagt.:


> Leider klappt das i=0 nicht. Es kommt der Hinweis auf eine eventuelle unendliche Schleife.


Das liegt daran, dass du i nicht in jedem Fall erhöhst, so dass die Schleifenbedingung unter Umständen immer erfüllt ist und die Schleife somit nie terminiert.


----------



## idaho369 (19. Sep 2016)

DANKE Mesniskusschaden!!!!!!! ES KLAPPT!!!!!!


----------

