Zur Simulation mit DIBS werden zwei Grundtypen der verwendeten Elemente unterschieden:
Folgende Funktionen muß eine Komponente enthalten:
Folgende Funktionen sind entfallen und werden hier nicht mehr dokumentiert. Eventuell noch vorhandene Funktionen im Quelltext können ersatzlos gestrichen werden.
Außerdem muß eine Komponente folgende Datenfelder zur Verfügung stellen:
Diese Funktionen muß eine Brücke muß enthalten:
Außerdem muß eine Brücke folgende Datenfelder zur Verfügung stellen:
Der Konstruktor der Komponente <Komponente> hat folgende Form:
<Komponente>::<Komponente>(Netz* dad,instance* dual,long nr)
: BasisKomponente(dad,dual,nr,BasisKomponente::Leitung_t)
{
Anzahl_LGS_Zeilen = ...;
Anzahl_LGS_Spalten = ...;
Anzahl_Variablen = ...;
AnzahlAusgaben = ...;
// weitere Konstruktion der Klasse
}
Neben dem Konstruktor der Komponente wird also auch der Konstruktor der Klasse BasisKomponente aufgerufen. Dieser Konstruktor muß zur Verfügung gestellt werden, ein Standardkonstruktor ohne Parameter wird nicht benötigt.
Prototyp
void Init( int FreieZeilenNummer, int FreieSpaltenNummer, int FreieAusgabeSpalte)
Parameter
FreieZeilenNummer | Nummer der ersten Zeile, in die die Regeln Rule in die Matrix des zu lösenden Gleichungssystem eingetragen werden. |
FreieSpaltenNummer | Nummer der ersten Spalte, in die die Unknown_Quantities in das zu lösende Gleichungssystem eingetragen werden. |
FreieAusgabeSpalte | Nummer der ersten Spalte, in die die auszugebenden Werte eingetragen werden. |
Funktion
Diese Funktion initialisiert die Komponente zur Simulation. An die
Member-Variable ErsteAusgabeSpalte wird
der Wert FreieAusgabeSpalte zugewiesen.
Für jede Regel Rule wird zunächst die Spaltennummer
mit der Funktion <Regel>.SetzteZeilenNummer() gesetzt. Die erste
Regel erhält hierbei die Zeilennummer FreieZeilenNummer, die zweite
Regel erhält hierbei die Zeilennummer FreieZeilenNummer+1 usw.
Für jede Unknown_Quantity wird dann
analog die Spaltennummer gesetzt.
Die Brücken der Komponente werden dann über die Funktion Verbinde
initialisiert. Mit welchen Parametern die Brücke initialisiert werden
muß, ergibt sich direkt aus der Beschreibung der Ports
der Komponente.
Beispiel
void Rohr::Init( int FreieZeilenNummer, int FreieSpaltenNummer,
int FreieAusgabeSpalte)
{
ErsteAusgabeSpalte = FreieAusgabeSpalte;
r1.SetzeZeilenNummer( FreieZeilenNummer );
q_punkt.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer );
P1.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer + 1 );
P2.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer + 2 );
((RohrEnde*)getBruecke(0))->Verbinde( P1, q_punkt, 1 );
((RohrEnde*)getBruecke(1))->Verbinde( P2, q_punkt, -1 );
}
Prototyp
ErzeugeBruecke(Komponente* k0, long Index0, int Pin0, Komponente *k1, long Index1, int Pin1)
Parameter
k0,k1 | Zeiger auf die durch die zu erzeugende Brücke verbundenen Komponenten. k0 stellt hierbei die Komponente dar, für die die Funktion ErzeugeBruecke aufgerufen wird, k1 zeigt auf die banachbarte Komponente. Es muß also gelten: k0 == this. |
Index0, Index1 | Sind die Indizes der Brücke in den Brücken-Zeiger-Feldern der verbundenen Komponenten. Siehe auch Beschreibung der Klasse Bruecke. |
Pin0, Pin1 | Nummern der Pins nach Cadic-Zählweise der beiden Komponenten, die durch die Brücke verbunden sind. Die Pin-Nummern geben den Pin der Komponente an, an dem die Brücke anliegt. |
Funktion
Diese Funktion wird im Konstruktor des Expansions-Netz aufgerufen. Da DIBS möglichst flexibel mit
anderen Systemen als Tankballastsystemen arbeiten soll, kennt das Grundsystem die verwendeten
Komponenten und somit auch die benötigten Brücken nicht. Es muß also eine Möglichkeit geschaffen werden,
wie ohne vorherige Kenntnis der genauen Brücken trotzdem die richtige Brücke verwendet werden kann,
um die einwandfreie Simulation zu gewährleisten. Hierzu wird von DIBS zunächst eine allgemeine Struktur mit
den richtigen Komponenten und allgemeinen Bruecken aufgebaut. Nach Aufbau dieser Struktur
werden die Komponenten erneut bearbeitet, und mit Hilfe der Funktion ErzeugeBruecke die von
der Komponente benötigte Brücke erzeugt. Vom Konstruktor
der Klasse ExpansionsNetz wird hierzu zunächst die alte Brücke gelöscht und dann eine neue, die korrekte,
Brücke erzeugt.
Querverweise
Beispiel
Bruecke* Rohr_131::ErzeugeBruecke(Komponente* k0, long Index0, int Pin0, Komponente *k1, long Index1, int Pin1)
{ Bruecke *retval; // Schritt 1: Neue Bruecke erzeugen switch(Pin0) { case 0: retval = new RohrEnde_12(k0, Index0, (long)Pin0, k1, Index1, (long)Pin1); ASSERT(retval); break; case 1: retval = new RohrEnde_12(k0, Index0, (long)Pin0, k1, Index1, (long)Pin1); ASSERT(retval); break; default: ASSERT(NULL); } // Schritt 2: BrueckenZeigerFeld der benachbarten Komponenten aendern this->putBruecke((int)Index0, retval); k1->putBruecke((int)Index1, retval); return retval; }
Prototyp
int GetAnzahlAusgaben();
Parameter
Funktion
Liefert den Wert AnzahlAusgaben zurück. Diese Funktion kann direkt
in die Header-Datei der Klassen geschrieben werden und als inline deklariert
werden.
Querverweise
Beispiel
inline int Rohr::GetAnzahlAusgaben()
{
return AnzahlAusgaben;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
int GetAnzahlLGSZeilen();
Parameter
keine
Funktion
Liefert den Wert Anzahl_LGS_Zeilen zurück. Diese Funktion kann
direkt in die Header-Datei der Klassen geschrieben werden und als inline
deklariert werden.
Beispiel
inline int Rohr::GetAnzahlLGSZeilen()
{
return Anzahl_LGS_Zeilen;
}
Prototyp
int GetAnzahlLGSZeilen();
Parameter
keine
Funktion
Liefert den Wert Anzahl_LGS_Spalten zurück. Diese Funktion kann
direkt in die Header-Datei der Klassen geschrieben werden und als inline
deklariert werden.
Beispiel
inline int Rohr::GetAnzahlLGSSpalten()
{
return Anzahl_LGS_Spalten;
}
Prototyp
int GetAnzahlVariablen();
Parameter
keine
Funktion
Liefert die Anzahl der in der Komponente vorhandenen Variablen zurück,
die im Wert Anzahl_Variablen gespeichert ist. Diese Funktion kann direkt
in die Header-Datei der Klassen geschrieben werden und als inline deklariert
werden.
Beispiel
inline int Rohr::GetAnzahlVariablen()
{
return Anzahl_Variablen;
}
Prototyp
void GetVariablen(Variable* kompVariablen,int* next);
Parameter
kompVariablen | Feld, das die Variablen aufnehmen soll |
next | zeigt auf den Index des Felds, an dessen Stelle die erste Variable geschrieben werden soll. |
Funktion
Diese Funktion speichert die Variablen der Komponente in das Feld kompVaraiablen.
Die erste Variable der Komponente wird dabei an die Stelle kompVariablen[*next]
geschrieben, die zweite an kompVariablen[(*next)+1] usw.
*next wird letztlich um die Anzahl der in der Komponente enthaltenen Variablen (Anzahl_Variablen) erhöht.
Querverweise
Beispiel
void Rohr::GetVariablen(Variable* kompVariablen,int* next)
{
kompVariablen[*next] = q1;
kompVariablen[(*next)+1] = q2;
*next += Anzahl_Variablen;
}
Prototyp
void PutVariablen(Variable* kompVariablen,int* next);
Parameter
kompVariablen | Feld, das die zu setzenden Variablen enthält. |
next | zeigt auf den Index des Felds, an dessen Stelle die erste zu setzende Variable steht. |
Funktion
Diese Funktion ist das Gegenstück zu GetVariablen()
und schreibt die in kompVariable gespeicherten Variablen zurück. Zu
beachten ist, daß GetVariablen() und PutVariablen() die Variablen
auch tatsächlich an die gleiche Stelle des Feldes schreiben und auch
auslesen. In welcher Reihenfolge das geschieht, ist jedoch egal, nur müssen
beide Funktionen die gleiche Reihenfolge benutzen.
*next wird letztlich um die Anzahl der in der Komponente enthaltenen Variablen
(Anzahl_Variablen) erhöht.
Querverweise
Beispiel
void Rohr::PutVariablen(Variable* kompVariablen,int* next)
{
q1 = kompVariablen[*next];
q2 = kompVariablen[(*next)+1];
*next += Anzahl_Variablen;
}
Prototyp
void Setze_LGS_Zeilen (CMatrix& A, CVector& b);
Parameter
A | Referenz auf die Matrix des zu lösenden Gleichungssystems. |
b | Referenz auf den Ergebnisvektor des zu lösenden Gleichungssystems. |
Funktion
Diese Funktion setzt die Zeilen des Gleichungssystems. Die Gleichungen
werden in der DDL-Beschreibung angegeben unter Rule <Regel>.
Für jede Regel <Regel> wird zunächst
<Regel>.Clear(A);
sowie ein oder mehrmals die Zuweisung
<Regel>.MatrizenElement(A, <Variable>.GlobaleSpaltenNummer)
= <Wert>;
durchgeführt. Die Anzahl der durchzuführenden Zuweisungen
ergibt sich direkt aus der angegebenen Regel.
Anschließend wird die Zuweisung
*<Regel>.VektorElement = <Wert>;
einmal ausgeführt.
Querverweise
Beispiel
void Rohr::Setze_LGS_Zeilen(CMatrix& A, CVector& b)
{
r1.clear(A);
r1.MatrizenElement(A, q_punkt.GlobaleSpaltenNummer ) = 1+Simulation.GetDeltaT()*k*R*fabs(q.GetValue());
r1.MatrizenElement(A, P1.GlobaleSpaltenNummer ) = -k;
r1.MatrizenElement(A, P2.GlobaleSpaltenNummer ) = k;
r1.VektorElement = &b[r1.ZeilenNr];
*r1.VektorElement = -k*R*q.GetValue()*fabs(q.GetValue());
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
int VariablenAusgabe (double t, CSystemverhalten *pVerhalten)
Parameter
t | Zeitpunkt, zu dem die Ausgabe erfolgt |
pVerhalten | Zeiger auf das Systemverhalten, in dem die Ausgabe abgelegt wird. |
Funktion
Diese Funktion schreibt die auszugebenden Werte in die Ausgabe pVerhalten.
Welche Werte auszugeben sind und deren Anzahl muß der Compiler bestimmen.
Hierzu kann z.B. in der DDL nach Deklaration der Konstanten, Unknown_Quantity
oder Variablen ein weiteres Flag angegeben werden.
Die auszugebenden Werte werden nacheinander über die Funktion pVerhalten->SetValue()
ausgegeben. Der erste Parameter gibt hierbei die Spalte an, in der die
Variable ausgegeben wird (also ErsteAusgabeSpalte, ErsteAusgabeSpalte+1
usw.), der zweite Parameter ist der Auszugebende Wert vom Typ CEinzelmessung,
der aus dem Zeitpunkt der Ausgabe, der über t gegeben ist sowie aus
dem auszugebenden Wert gebildet wird.
Querverweise
Beispiel
int Rohr::VariablenAusgabe (double t, CSystemverhalten *pVerhalten)
{
pVerhalten->SetValue(ErsteAusgabeSpalte, CEinzelmessung(t,q1.GetValue()));
pVerhalten->SetValue(ErsteAusgabeSpalte+1, CEinzelmessung(t,q2.GetValue()));
return 2; // Anzahl ausgegebener Variablen
}
Prototyp
void ZeitSchritt ();
Parameter
keine
Funktion
Für jede Unknown_Quantity, die eine Ableitung einer Variablen
ist, wird integriert. Dies wird durch die Anweisung
<Variable>.IntegriereUeber(<Ableitung>);
erledigt.
Querverweise
Beispiel
void Rohr::ZeitSchritt()
{
q.IntegriereUeber( q_punkt);
}
Prototyp
void Eingabemaske ();
Parameter
keine
Funktion
Diese Funktion bestimmt alle zusätzlichen Parameter einer Komponente, die sich nicht aus
dem Gleichungssystem ergeben, wie z.B. spezielle numerische Parameter (z.B. der Durchmesser eines Rohres).
Hierzu wird zunächst für jeden Wert die Cadic-Funktion read_text aufgerufen, deren Ergebnis in eine
Zahl vom Typ double gewandelt wird. Im zweiten Schritt werden die Parameter berechnet, für die
in der DDL eine Berechnungsformel angegeben ist.
Beispiel
void <Komponente>::Eingabemaske()
{
// lokale Konstanten
char dummy[21];
read_text("Rohrlaenge",20,dummy,FLOAT);
l_21 = a2d(dummy);
read_text("Rohrdurchmesser",20,dummy,FLOAT);
d_25 = a2d(dummy);
// Instantiierung der lokalen Konstanten
Q_23 = (((Pi_4)*(d_25))*(d_25))/(4);
k_39 = (Q_23)/((rho_7)*(l_21));
K_37 = ((Lambda_10)*(l_21))/(d_25);
R_add_45 = 100;
delta_h_43 = 0;
R_58 = (R_add_45)+(((K_37)*(rho_7))/(((2)*(Q_23))*(Q_23)));
P_add_65 = ((rho_7)*(g_2))*(delta_h_43);
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Prototyp
void Default(a,b)
Parameter
a | a hat keine Bedeutung |
b | b hat auch keine Bedeutung |
Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.
Querverweise
Beispiel
void KeineKomponente::Default(a,b)
{
a = a;
b = b;
}
Diese Felder müssen in allen Komponenten vorhanden sein.
Beschreibt die Anzahl der Zeilen, die die Komponente zum Gleichungssystem
beiträgt. Der Wert dieses Feldes ergibt sich aus der Anzahl der in
der Komponente vorhandenen Regeln.
Der Wert ist im Konstruktor der Komponente festzulegen.
Beschreibt die Anzahl der Spalten, die die Komponente zum Gleichungssystem
beiträgt. Der Wert ergibt ich aus der Anzahl der vorhandenen Unknown_Quantities.
Dieser Wert wird im Konstruktor gesetzt.
Gibt die Anzahl der in der Komponente vorhandenen Variablen an. Dieser
Wert wird im Konstruktor gesetzt.
Gibt die Anzahl der in der Komponente vorhandenen auszugebenden Werte
an. Ein auszugebender Wert kann von jedem Typ sein, der sich auf ein double
zurückführen läßt, also eine Variable, eine Unknown_Quantity
oder eine Konstante. Dieser Wert wird im Konstruktor gesetzt.
ErsteAusgabeSpalte beschreibt die Spalte des Systemverhaltens, in das
die erste Ausgabe erfolgt. Dieser Wert wird in der Init-Funktion der Komponente
gesetzt.
Anzahl_FehlerParameter beschreibt die Anzahl der möglichen Parameter einer Komponente, die
einen Fehler charakteriesieren.
PositionFehlerParameter beschreibt ???.
FehlerStatus beschreibt ???.
Der Konstruktor der Komponente <Komponente> hat folgende Form:
<Bruecke>::<Bruecke>(Komponente *k0,long i0,long pin0,
Komponente* k1,long i1,long pin1)
: Bruecke(k0,i0,pin0,k1,i1,pin1)
{
Verbindungen = 0;
Anzahl_LGS_Zeilen = ...;
x1 = y1 = ... = xn = yn = NULL;
// weitere Konstruktion der Brücke
}
Neben dem Konstruktor der Brücke wird also auch der Konstruktor der Klasse Bruecke aufgerufen. Dieser Konstruktor muß zur Verfügung gestellt werden, ein Standardkonstruktor ohne Parameter wird nicht benötigt.
Prototyp
void Verbinde (Unknown_Quantity& u1, ..., Unknown_Quantity&
un, int direction);
Parameter
u1 .. un | Unknown_Quantities, die die Brücke übertragen soll. |
direction | Richtung der Brücke: 1 oder -1 |
Funktion
Diese Funktion definiert die Unknown_Quantities, die die Brücke
übertragen soll. Jede Unknown_Quantity, die übertragen wird,
trägt eine Zeile zum Gleichungssystem in der Form x1 = y1 bei. Dadurch
wird sichergestellt, daß die verbundenen Komponenten mit den gleichen
Werten operieren. Eine Brücke verbindet maximal zwei Komponenten und
Verbinde wird daher maximal zweimal aufgerufen. Bei jedem Aufruf zählt
die Funktion die interne Variable Verbindungen um eins hoch. Is Verbindungen
größer als eins und wird dennoch die Funktion verbinde aufgerufen,
so wird ein noch zu definierender interner Fehler ausgegeben.
Beim ersten Aufruf werden die übergebenen Werte den X-Werten zugewiesen, beim zweiten Durchlauf den Y-Werten. In welcher Reihenfolge die Zuweisung erfolgt, ist egal, nur sollte in beiden Durchläufen die gleiche Zuweisung erfolgen.
Beispiel
void RohrEnde::Verbinde( UnknownQuantity& u1, UnknownQuantity&v1, int direction ) { switch(Verbindungen) { case 0: x1 = &u; // P y1 = &v; // q_punkt d1 = direction; break; case 1: x2 = &u; y2 = &v; d2 = direction; break; default: internal_error( "#217" ); } Verbindungen++; }
Bemerkung
In der Form, in der die Funktion verbinde zur Zeit implementiert ist,
funktioniert das nicht, da nur ZWEI Unknown_Quantities übergeben werden
können. Man müßte hierzu auf ein Feld ausweichen, um eine
Variable Anzahl von Unknown_Quantities übergeben zu können (eine
Brücke kann bestimmt mehr als zwei Werte übertragen)
Prototyp
void Init (int FreieZeilennummer);
Parameter
FreieZeilennummer | Gibt die erste freie Zeile des LGS an, in die die erste Regel geschrieben wird. |
Funktion
Diese Funktion setzt für alle Regeln r1 bis rn die Zeilennummer.
Hierzu wird für jede Regel die Funktion Rule::SetzteZeilenNummer()
mit dem Wert der jeweils ersten freien Zeile aufgerufen.
Beispiel
void RohrEnde::Init( int FreieZeilenNummer )
{
r1.SetzeZeilenNummer( FreieZeilenNummer );
r2.SetzeZeilenNummer( FreieZeilenNummer + 1);
}
Prototyp
void Setze_LGS_Zeilen (CMatrix& A, CVector& b);
Parameter
A | Referenz auf die Matrix des zu lösenden Gleichungssystems. |
b | Referenz auf den Ergebnisvektor des zu lösenden Gleichungssystems. |
Funktion
Diese Funktion setzt die Zeilen des Gleichungssystems. Die Gleichungen
sind aller der Form x = y. Für jede Regel <Regel> wird
zunächst
<Regel>.Clear(A);
sowie zweimal die Zuweisung
<Regel>.MatrizenElement(A, x1->GlobaleSpaltenNummer) = <Wert>;
<Regel>.MatrizenElement(A, y1->GlobaleSpaltenNummer) = <Wert>;
durchgeführt. Die Anzahl der durchzuführenden Zuweisungen ergibt sich direkt aus der angegebenen Regel.
Anschließend wird die Zuweisung
*<Regel>.VektorElement = 0;
einmal ausgeführt.
Beispiel
void RohrEnde::Setze_LGS_Zeilen(CMatrix& A, CVector& b)
{
r1.clear(A);
r1.MatrizenElement(A, x1->GlobaleSpaltenNummer ) = 1;
r1.MatrizenElement(A, y1->GlobaleSpaltenNummer ) = -1;
r1.VektorElement = &b[r1.ZeilenNr];
*r1.VektorElement = 0;
r2.clear(A);
r2.MatrizenElement(A, x2->GlobaleSpaltenNummer ) = d1;
r2.MatrizenElement(A, y2->GlobaleSpaltenNummer ) = d2;
r2.VektorElement = &b[r2.ZeilenNr];
*r2.VektorElement = 0;
};
Prototyp
int GetAnzahlLGSZeilen();
Parameter
keine
Funktion
Liefert den Wert Anzahl_LGS_Zeilen zurück. Diese Funktion kann
direkt in die Header-Datei der Klassen geschrieben werden und als inline
deklariert werden.
Beispiel
inline int RohrEnde::GetAnzahlLGSZeilen()
{
return Anzahl_LGS_Zeilen;
}
Diese Felder müssen in allen Brücken vorhanden sein.
Beschreibt die Anzahl der Zeilen, die die Brücke zum Gleichungssystem
beiträgt. Der Wert dieses Feldes ergibt sich aus der Anzahl der in
der Brücke vorhandenen Regeln.
Der Wert ist im Konstruktor der Brücke festzulegen.
Verbindungen ist eine interne Variable, die verwendet wird, um die korrekte initialiserung des Systems sicherzustellen. Jedesmal, wenn die Fuktion Bruecke::Verbinde aufgerufen wird, wird die Variable um eins erhöht. Da eine Brücke nur zwei Komponenten miteinander verbinden kann, liegt ein Fehler vor, sobald Verbindungen den Wert eins übersteigt. In diesem Fall wird versucht, eine Bruecke mit mehr als zwei Komponenten zu verbinden, was zu einem nicht behebbarem Fehler im System führt.
Definieren die Richtung der Brücke aus Sicht der jeweiligen Komponente.