Um in herkömmlichen C-Programmen Meldungen auszugeben, benutzt man
normalerweise die Funktion printf oder fprintf. Mit Hilfe dieser Funktion kann man Werte
mit verschiedenen Datentypen ausgeben (int, float, char, etc.). Dazu muß
der Funktion ein Format-String mit Informationen über die
auszugebenden Datentypen und die Daten selbst als Parameter übergeben
werden. Das sieht z.B. so aus:
int tag = 27; char monat[] = "Mai"; printf("Heute ist der %d. %s\n", tag, monat); fprintf(stderr, "Heute ist der %d. %s\n", tag, monat);
Hierbei bedeutet %d, daß eine ganze Zahl, und %s, daß eine Zeichenkette ausgegeben werden soll. Wenn die Parameter falsch angegeben wurden, wird das eventuell erst bei der Ausführung des Programms bemerkt. Neue Datentypen müssen in ihre Komponenten zerlegt werden und können erst dann über die vorhandenen Typen ausgegeben werden.
Die Programmiersprache C++ bietet eine einfachere Möglichkeit. Hier
wird bei der Übersetzung in Programmcode anhand der Datentypen der
auszugebenden Werte erkannt, welche Ausgaberoutine verwendet werden
muß. Es gibt verschiedene Ausgabegeräte (z.B. cout und cerr) und dazu passend den Operator <<,
mit dem man Daten ausgeben kann. Für die Grunddatentypen ist er
vordefiniert, kann aber für weitere zusätzlich definiert und dann
genauso mit den vordefinierten zusammen benutzt werden. Oben genanntes
Beispiel sieht dann so aus
:
int tag = 27; char monat[] = "Mai" cout << "Heute ist der " << tag << ". " << monat << endl; cerr << "Heute ist der " << tag << ". " << monat << endl;
Für die Fehlerausgabe wurde nun ein neues Ausgabegerät error erstellt. Es läßt sich analog wie die C++ Ausgabegeräte benutzen.
int tag = 27; char monat[] = "Mai" error << "Heute ist der " << tag << ". " << monat << endl;
Man kann durch einen Parameter bestimmen, ob die Meldungen auf dem
Terminal ausgegeben werden, oder ob sie über das Messagesystem an den
opcon-Prozeß geschickt werden. Dadurch ist es möglich, erst beim
Programmstart festzulegen, wie sich das Programm verhalten soll. Für
das Austesten startet man es mit einem Terminal als Ausgabegerät und
kann hier dann auch direkt die Fehlermeldungen erhalten. Im Normalfall
wird man das Programm aber als Dämon starten und die Fehlermeldungen über das
Messagesystem an zentraler Stelle mit den anderen Prozessen
überwachen.
Eine andere Möglichkeit ist das Einstellen von Ausgabestufen beim Programmieren der Ausgaben. Dafür wird wie folgt die Funktion level mit der Ausgabestufe als Parameter aufgerufen:
error << "Beginn der Funktion X" << level(500) << endl;
Wichtige Meldungen erhalten niedrige Stufen, weniger wichtige höhere Stufen. Beim Programmlauf ist es dann möglich, anzugeben, bis zu welcher Stufe Meldungen ausgegeben werden sollen. Diese Fähigkeit ist nützlich zur Fehlersuche. Man kann z.B. bei jedem Funktionsaufruf die Stufe erhöhen und beim Verlassen der Funktion wieder erniedrigen. Dadurch erreicht man, daß man den Programmablauf bei Bedarf mehr oder weniger tief in die Funktionen hinein verfolgen kann. Für diese Vorgehensweise stehen fertige Funktionen zur Verfügung. Auch die ECS-Funktionen, mit deren Hilfe die Kommunikation über das Messagesystem stattfindet, benutzen dieses Konzept.
Mit der Benutzung der oben beschriebenen Device-Klasse (siehe
Abschnitt ) wird automatisch eine globale Instanz der
Error-Klasse angelegt, und mit Hilfe der Programmparameter wird
der Ausgabekanal, also Terminal oder Messagesystem, und die
Ausgabestufe eingestellt.