Programmteil in C nur einmal durchlaufen.

Gast #4926498
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
Gast
Hmm, okay, danke.
gbt_pushputton ist aber eine bitvariable welche ich im keypad-interrupt 
toggle.
ich muss dann whrscheinlich eine neue bitwariable nehmen die ich extra 
hierfür benutze?!

grüße
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
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
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.
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.
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

Eine eigene Frage? Dieser Thread ist über 9 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.