while schleife innerhalb endloser while schleife

Gast #1251697
Ich habe ein Problem mit while-Schleife innerhalb eine endlose 
while-Schleife
1
while (1) {
2
 ...
3
 sharp = distance(AD1);
4
 i=0;
5
 while (sharp > 3.6 && sharp < 12.1) {
6
      
7
   P83 = 1;
8
   wait_10ms(i);
9

10
   i+=5;
11
   sharp = distance(AD1);
12
   if (i<20) {
13
     P80=0; P81=0; P81=0; P82=0; 
14
   } else {
15
     if (i < 40) {
16
        P80 = 1; P81 = 0; P82 = 0; P83 = 0;
17
     } else {
18
  if (i < 55) {
19
    P80 = 0; P81 = 1; P82 = 0; P83 = 0; 
20
  } else {
21
    P80 = 0; P81 = 0; P82 = 1; P83 = 0;
22
  }
23
     }
24
   } 
25
 }
26
 ...
27
}

Ich möchte alle if-Anweisung ausserhalb der while-Schleife verschieben, 
aber dieser Code gibt keine Ausgabe an Ports.
Wo liegt der Fehler?

Danke für die Hilfe.
Persönliche Seite
Hi,
warum machst du nach deinem else eine geschweifte Klammer?
1
if (i<20) {
2
      P80=0; P81=0; P81=0; P82=0;
3
    } else {
4
      if (i < 40) {
5
         P80 = 1; P81 = 0; P82 = 0; P83 = 0;
6
      } else {
7
   if (i < 55) {
8
     P80 = 0; P81 = 1; P82 = 0; P83 = 0;
9
   } else {
10
     P80 = 0; P81 = 0; P82 = 1; P83 = 0;
11
   }

Ändert in diesem Beispiel an der Logik des Ausdrucks nichts aber ein 
else if finde ich besser lesbar.

Ansonsten: Kompletten Code posten!
Hast du Pxx auch auf Ausgang gesetzt?

Grüße
Beuth schrieb:

Ich geh mal davon aus, dass die Zuweisungen an P80, P81, P82 und P83 die 
Portausgaben sind.

> Ich möchte alle if-Anweisung ausserhalb der while-Schleife verschieben,

Wozu?
Der ganze if-else if Block dient nur dazu, den Messvorgang an den 
Portpins P80, P81 und P82 nach aussen zu transportieren. Wenn du den aus 
der Schleife rausziehst, kannst du ihn auch gleich löschen, weil er dann 
keine Funktion mehr erfüllt.

Edit:
OK, keine Funktion ist übertrieben. Er kann dann immer noch die Funktion 
erfüllen, über die Portpins zu dokumentieren wieviele 
Schleifendurchgänge notwendig waren, bis die Schleife verlassen wurde, 
sofern sie überhaupt mal verlassen wird
1
  while (1) {
2
    ...
3
    sharp = distance(AD1);
4
    i = 0;
5
    while (sharp > 3.6 && sharp < 12.1) {
6
      P83 = 1;
7
      wait_10ms(i);
8

9
      i += 5;
10
      sharp = distance( AD1 );
11

12
      if( i >= 20 )
13
         P83 = 0;
14
    }
15

16
    if (i < 20) {
17
      P80 = 0;
18
      P81 = 0;
19
      P82 = 0; 
20
    }
21
    else if (i < 40) {
22
      P80 = 1;
23
      P81 = 0;
24
      P82 = 0;
25
    }
26
    else if (i < 55) {
27
      P80 = 0;
28
      P81 = 1;
29
      P82 = 0; 
30
    }
31
    else {
32
      P80 = 0;
33
      P81 = 0;
34
      P82 = 1;
35
    }
36
  }
Gast
Hallo,

@Robert K.
es war einen Schreibfehler.
1
      } else {
2
         if (i < 55) {
3
           P80 = 0; P81 = 1; P82 = 0; P83 = 0;
4
         } else {
5
           P80 = 0; P81 = 0; P82 = 1; P83 = 0;
6
         }
7
      }
So sollte es sein.

Wenn diese If-Anweisung innerhalb in while-Schleife liegt, läuft das 
ganze Programm eigentlich fehlerfrei.
Aber diese Ausgänge sind mit einem Roboterarm angeschlossen, und möchte 
nur den letzten Wert von i überprüfen.
z.B: wenn i = 45 ist, möchte ich direkt P81=1 am Ausgang ausgeben, nicht 
erstmal P80=1, dann P81=1.
Versteht Ihr, was ich meinte?
Durch die Kodierung ist 3 unterschiedliche Greifpositionen programmiert:
P80=1 od. P81=1 od. P82=1

@Karl heinz Buchegger
Wenn P83=1 ist, beginnt das Hauptprogramm von dem Roboter.
Danke für die Korrektur.

Ich würde die Code mit else if verbessern, wie Ihr vorgeschlagen hast

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.