Programmteil in C nur einmal durchlaufen.

Gast #4926498
Lesenswert?
• ▲
▼
Hallo,

ich würde gerne in meinem C Program bei einem Einsprung in eine 
while-Schleife einen Teil gerne nur einmal machen. Was ist hiefür die 
eleganteste Lösung?
Könnt ihr mir ein paar tipps geben wie ihr das macht? Mit einer Semaphor 
bzw. einem Flag? Welchen Typ nehmt ihr? Bit-Variable?

Das was im else-Zweig steht, würde ich gerne immer nur einmal machen.
1
while (guc_menu == MENU)
2
{  
3
 if (gbt_timercount_1 == ON) // Semaphor (500ms) gesetzt?
4
  {
5
   gbt_timercount_1 = OFF; // Semaphor zurücksetzen
6

7
   v_monitoring ();
8
   v_auswertung ();
9
   v_temp_ausgabe ();
10
   v_skalierung ();
11
      
12
   if (gbt_pushbutton_onoff)
13
    {
14
     symbole (0x47,0x50);
15
     v_regelung ();    // Regeln (PID)
16
    }
17
   else       // Regelung ausschalten 
18
    {  
19
     symbole (0x47,0x00);            
20
     v_write_mcp4728 (MCP4728, CON_MCP4728_CHA, HALFSCALE);
21
     v_write_mcp4728 (MCP4728, CON_MCP4728_CHC, HALFSCALE);
22
     v_ausgabe_variable (0, 11, HALFSCALE, 4, 0, 0);
23
     v_ausgabe_variable (0, 16, HALFSCALE, 4, 0, 0);
24
    }
25
   if (gbt_pushbutton_setup)
26
    {
27
     gbt_pushbutton_setup = OFF;
28
     guc_menu = MENU_SETUP;
29
    }
30
   }      
31
}






Grüße Robert
#4926547
Lesenswert?
• ▲
▼
Also.... Diese triviale Aufgabe beinhaltet eine endliche Anzahl 
Loesungen. Probier die doch einfach aus. Es ist sicher sehr lehrreich.

Natuerlich erst nach dem tagelangen, erfolglosen Absuchen des gesammten 
Internetes.
Die erste Fragestellung ist somit, wie bin ich sicher, das gesammte 
Internet abgesucht zu haben. Gurgel kann das zwar, aber erst auf die 
richtige Frage.
Gast #4926556
Lesenswert?
• ▲
▼
Vor der while-Schleife mache ich das auch. Ich habe aber die Möglichkeit 
in der while-Schleife die Regelung an- und wieder auszuschalten.
Ich weiß dass es eine Menge Lösungen gibt. Mich hatte nur interessiert 
wie ihr das macht und wie ihr die variablen dann nennt um den Überblick 
zu behalten wenn so etwas öffter vorkommt.

Grüße
Gast #4926561
Lesenswert?
• ▲
▼
Robert schrieb:
> die Regelung an- und wieder auszuschalten.

Das ist aber eine ganz andere Anforderung wie "nur einmal"!
Wenn du dein Problem so flapsig beschreibst kriegst du halt unpassende 
Antworten.

Wenn du etwas an oder ausschalten willst dann mach es über eine boolsche 
Variable, falls es mehrere logisch verknüpfte Dinge sind dann denke über 
einen Zustandsautomat nach.
#4926588
Lesenswert?
• ▲
▼
Eine Zustandsmaschine oder Zustandsautomat, oder Statemachine, ist der 
normale Ansatz fuer solche Konstrukte.
Der Main-Loop ist aussen rum. Iterationen(Loops) gibt es innen drin 
keine, und gewartet wird nur genau an einem Ort, falls ueberhaupt.

Falls ueberhaupt, kann man dort spaeter einen Sleep() zum Stromsparen 
einfuegen.

Der Programmfluss faellt durch, wird nirgendwo blockiert.
#4926757
Lesenswert?
• ▲
▼
Robert schrieb:
> ich würde gerne in meinem C Program bei einem Einsprung in eine
> while-Schleife einen Teil gerne nur einmal machen. Was ist hiefür die
> eleganteste Lösung?

Da man nicht "in eine Schleife springt", sondern eher bei der
Programmausführung die Schleife erreicht, ist es ganz einfach:
man zieht diesen Code aus der Schleife heraus und davor. Dann
wird er vor dem Erreichen der Schleife genau einmal ausgeführt.


Robert schrieb:
> Vor der while-Schleife mache ich das auch. Ich habe aber die Möglichkeit
> in der while-Schleife die Regelung an- und wieder auszuschalten.

Wenn du die Regelung innerhalb der Schleife (mehrfach) an- und
ausschalten können willst, dann mußt du auch den else-Teil
mehrfach durchlaufen. Allerdings ist dann deine Programmlogik
fehlerhaft. Du hast jetzt nur 1 Bit: Regelung an oder aus.
Was du anscheinend willst, ist beim Wechsel von "an" zu "aus"
einen bestimmten Codeabschnitt einmalig auszuführen. Dann gehört
der aber nicht einfach in einen else Zweig, sondern du solltest
ein separates if dafür verwenden:

1
while (...)
2
{
3
  if (regelung_ist_an)
4
  {
5
    //zyklischer code für die Regelung
6
  }
7

8
  if (regelung_war_an && !regelung_ist_an)
9
  {
10
    //einmaliger code zum Abschalten der Regelung
11
  }
12

13
  //den letzten Wert merken
14
  regelung_war_an= regelung_ist_an;
15
}


Ach ja:

- deine Einrückung saugt
- deine Variablennamen saugen noch mehr

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren