C Bedingungen die immer wieder neu erfüllt sein müssen

Gast #498337
Lesenswert?
• ▲
▼
Hallo,

ich habe folgendes Problem. Für eine uC-Netzteilsteuerung durchläuft der 
Code Bedingungen. Diese sind von einander abhängig. Ist Bedingung 1 
erfüllt. Teste die Bedingung 2. Ist Bedingung 1 & 2 erfüllt teste 
Bedingung 3 usw...

In C sind das dann schwer verschachtelte If else Codes. Echt ätzend.

 if(portreg->portb.bit.PWR_OK == 1)
  {
    if(portreg->portb.bit.SOFT_OK == 1)
    {
      // Reset Flg ...
      if(uTimeControlFlg.sTimeControlFlg.DCOver == 1)
      {
        ....
        if{...}
      }
      else....
    else
    {
       // Generate error
    }
  usw.

Wie man schnell sieht ist dieser Code total unübersichtlich. Mir würden 
hier so eine Art Statemachine viel besser gefallen (switch case). 
Allerdings müßte man dann in jedem Zustand alle vorhergehenden 
Bedingungen testen. Ist auch Mist.

Vieleicht kennt Ihr das Problem oder habt einen guten 
Codestruktur-Vorschlag. Bin echt gespannt auf Eure Lösungen.

Sebastian

Gast #498342
Lesenswert?
• ▲
▼
Ohne die genaue Applikation zu kennen kann man nicht
pauchal sagen, ob ne Statemachine helfen würde.

Ich finds persönlich aber deutlich übersichtlicher,
wenn man in solchen fällen, wie deinem obigen, auf das
NICHTerfülltsein der Bedingung(en) testet und dann ggfs. abbricht

Beispiel:

bool TesteBedingungen()
{
  // teste nacheinander verschiedene bedingungen
  if (bedingung_1 == FALSE) return FALSE;
  if (bedingung_2 == FALSE) return FALSE;
  if (bedingung_3 != 42) return FALSE;

  // alles erfüllt
  return TRUE;
}

Ohne die Einrückerei liest sich sowas viel besser.
Abgesehen davon muß man sowieso ab und an mal überlegen,
ob sich das was man abtesten möchte, nicht auch anders
ausdrücken läßt.

Gast #498912
Lesenswert?
• ▲
▼
Man kann eine State-Machine definieren.
Erst überlegt man, wieviele Zustände es im System überhaupt gibt.
Jeder existierende State kriegt eine Nummer.
Die Nummer zählt / setzt man entsprechend in jedem State.

Die Übergangbedingungen von einem bestehenden Zustand in den nächsten 
fragt man ab, indem die jeweiligen Übergangsbedingungen über  &&  und 
||  wie bereits geraten verknüpft werden.

In main()  erfolgt die Verzweigung über  case  anhand der 
Zustandsnummer.

Gast #498926
Lesenswert?
• ▲
▼
Du kannst dir auch 'Merkerbytes' anlegen und jedemal wenn eine Bedingung 
erfüllt wird ein Bit dafür setzen und löschen wenn sie nicht erfüllt 
ist. Dann kannst du die Merkerbytes mit Switch/case und der richtigen 
Verknüpfung abfragen.
Leider kenne ich das Programm nicht und weiß somit nicht wie einfach 
Merkerbits gesetzt werden können (z.B. bei der AD-Wandlung gleich 
Grenzwerte abfragen? Wenn Schalter oder Ausgänge betätigt/gesetzt 
werden?). Dazu müsstest du die Ein- Ausgänge in einer Schleife abfragen 
(nicht dort vernüpfungen abfragen).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.