Forum: Mikrocontroller und Digitale Elektronik Code Verständnis


von codierer (Gast)


Lesenswert?

Hallo

habe unter "Codesammlung" folgendes Code Fragment gefunden:
1
....
2
3
void delay_1ms( u16 i )
4
{
5
  do{
6
    _delay_ms( 1 );
7
  }while( --i );
8
}
9
10
11
int main( void )
12
{
13
14
    delay_1ms( 10000 );  
15
}
16
...

Ich verstehe die do while schleife irgendwie nicht. Kann man diesen Code 
auch anders schreiben, so dass auch ein Amateur wie ich es bin versteht?
Also eine äquivalente Schreibweise.

Grüsse

von Jens S. (djstorm)


Lesenswert?

Ganz einfach: Die Funktion delay_1ms wird mit einem Parameter i (hier 
10000) aufgerufen.

Die Schleife in der Funktion macht dann in jedem Durchlauf 1ms Pause, 
zieht 1 von der Variablen i ab (i--) und widerholt so lange die 
Schleife, so lange i größer als 0 ist (wenn i durch i-- 0 wird, wird die 
Schleife verlassen).

von Mano W. (Firma: ---) (manow)


Lesenswert?

1
void delay_1ms( u16 i )
2
{
3
  while(i) {                 // leserlicher while(i > 0)
4
    _delay_ms( 1 );
5
    --i;
6
}

Was macht dir Probleme?

von codierer (Gast)


Lesenswert?

Hallo

mir hat das --i Probleme gemacht. Aber jetzt hab ich es verstanden. 
Eigentlich ganz einfach.
Danke

von Mark .. (mork)


Lesenswert?

Mario wrote
1
void delay_1ms( u16 i )
2
{
3
  while(i) {                 // leserlicher while(i > 0)
4
    _delay_ms( 1 );
5
    --i;
6
}

Das ist aber nicht dasselbe wie
1
void delay_1ms( u16 i )
2
{
3
  do{
4
    _delay_ms( 1 );
5
  }while( --i );
6
}

Beim ersteren wird zuerst überprüft, ob i bereits null ist und erst dann 
1ms gewartet, während bei letzterem zuerst gewartet und dann überprüft 
wird. Eigentlich ist deine Methode die "richtigere" weil es logischer 
ist, dass beim Aufruf von delay_1ms(0) nicht garnicht gewartet wird.

MfG Mark

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vorallem wird wen i = 0 ist die Schleife da i vorher decrementiert wird 
65536 mal durchlaufen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.