Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Unübersichtliches Programm Kategorie: Programmierung (von André H. - 31.10.2004 12:28)
Als Antwort auf Unübersichtliches Programm von ACU - 30.10.2004 13:15
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
Hallo ACU,

> Ich habe ein Programm für meine CC2 geschrieben. Leider ist es aufgrund von vielen
>  If Abfragen und Klammern (wie ihr unten selbst sehen könnt) sehr unübersichtlich geworden.
> Das Programm macht nicht, was es soll und durch das unübersichtliche Programm
> wird meine Fehlersuche erschwert. Wie kann ich das Programm besser machen?

Also Unübersichtlich finde ich es noch nicht.
Aber ich denke, der Code soll nur ein Beispiel sein.
Die Waffe Nr. 1 gegen Unübersichtlichkeit ist eine klare logische Strukturierung.
D.h.: Mache gezielt aus bestimmte Sequenzen Funktionen.
Bei grö�eren Projekten gilt das auch für Module.
Es macht Sinn für übergeordnete Bereiche eigene (Projekt-)Module zu erstellen.
z.B. für Einstellungen: Ein Modul für das Menü. evtl. Sogar eines Pro Menüebene, wenn
die Menüs sehr verschachtelt sind.

Aber ein paar Anmerkungen zu Deinen Routinen selbst:

      sleep 9999999;
Wie Rene schon geschrieben hat, kann man bei sleep nur einen Integer, oder besser gesagt
Word-Bereich angeben. Gültige Parameter sind 0 bis 32767, -32768 bis -1 .
-32768 bis -1 werden als 32768 bis 65535 interpretiert. Man kann mit einem sleep also
max. 65,535 Sekunden Warten.
Dein 9.999.999 ist als HEX geschrieben 0x98967F.
Da hier nur die ersten 16 Bit verwendet werden, wird sleep also 0x967F übergeben, was wiederum
38,527 Sekunden sind.

if Entfernungrechts >= Entfernunglinks
  {
   ...
  }
 if Entfernungrechts < Entfernunglinks
  {
   ...
  }

Das zweite If ist hier eigentlich unnötig, da dies mit einem If-else-Konstrukt besser
realisierbar ist:
if Entfernungrechts >= Entfernunglinks
  {
   ...
  }
 else
  {
   ...
  }


Den Teil in den If-Bedingungen kannst Du z.B. zu Funktionen machen, sodaÃ? Du
die Ã?bersichtlichkeit wahrst:
if Entfernungrechts >= Entfernunglinks
     HindernisLinks();
   else
     HindernisRechts();


Man kann das ganze aber noch optimieren, wenn man eine Funktion schreibt, die gleichermaÃ?en
für HindernisLinks() und HinternisRechts() aufgerufen werden kann.
Das spart Speicher und schreiberei. ;-)


const beep[]=4,33;
const PortA[]=10,11;
const PortB[]=9,8;

function Ausweichen(byte Richtung)
{
 plm.beep(beep[Richtung]);
 ports.set(PortA[Richtung],1);
 ports.set(PortB[Richtung],1);
 run Timer;
 while Weitermachen
 {
  if Entfernunglinks>=lopt and Entfernungrechts>=ropt
    {
     lopt=Entfernunglinks;
     ropt=Entfernungrechts;
    }

  if Entfernunglinks <=13 //Richtung umkehren im Notfall
   {
    ports.set(10,0);
    ports.set(9,0);
    sleep 300;
    ports.set(11,1);
    ports.set(8,1);
   }
  if Entfernungrechts <=13 //Richtung umkehren im Notfall
   {
    ports.set(11,0);
    ports.set(8,0);
    sleep 300;
    ports.set(10,1);
    ports.set(9,1);
   }
  }
 plm.beep(-1);
 Weitermachen=1;
 sleep -1;
}

thread xy
{
 ...
 ...
 if Entfernungrechts >= Entfernunglinks
     Ausweichen(0);
   else
     Ausweichen(1);
 ...
}


Das ganze soll aber nur ein Vorschlag sein.

MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: