Reference in PlugBox

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Reference in PlugBox
Laut Spezifikation besitzt die Klasse Plugbox folgende Method

void assign (unsigned int slot, Gate& gate)

Aber wie kann man das “gate” in Klass Plugbox speichern.

Weil Gate eine abstrakte Klasse ist, kann man nicht zuerst vielen Gate oder Gate& in Klasse vorbereiten.
Wegen Reference ist ein Zeiger auch unmöglich.

Was soll ich machen, um den Parameter zu sichern?

Danke.


Erstell Dir ein Array von Zeigern auf Gate-Objekte. In assign(unsigned int slot, Gate& gate) speicherst du dann einfach einen Zeiger auf das Gate-Objekt an der entsprechenden Stelle in das Array.


wird das Object nach dem Aufruf automatisch vernichtet?


Hi,

Sleipnir hat Recht: am besten ein Array von Zeigern auf Gate-Objekte speichern. Ein Zeiger ist nicht unmoeglich. Einfach die Adresse des per Referenz uebergebenen Objektes ermitteln und diese speichern:

void assign (unsigned int slot, Gate& gate) {
    Gate* foo = &gate;
}

Das Objekt wird nach dem Aufruf natuerlich auch nicht vernichtet. Warum sollte es das? Vielleicht verstehe ich auch deine Frage nicht richtig - kannst du sie nochmal anders formulieren?


Dies ist ein einfach Beispiel. Vielleicht gibt es Syntaxfehler.

void func() {
   Plugbox plugbox;

   for(int i = 0; i<16; i++) {
      Panic panic(); // create object on stack
      plugbox.assign(i, panic);
   } // end of the scope, panic.~Panic() will be called.

   // now plugbox has 16 invalid pointer
}

static Panic p;
extern Plugbox plugbox;

void foo ()
{
    for (int i = 0; i < 16; ++i)
        plugbox.assign(i, panic);
}

Ja es funktioniert, obwohl mit Voraussetzungen, dass das Laufzeitmanipulation von Plugbox ist enge beschränkt.

Für unsere winzig OS spielt es so wie so kleine Rolle.

Danke für die Lösung.


Den Satz verstehe ich nicht. Kannst du das noch mal anders ausdrücken?


Da die Treiber eh globale Instanzen sind (siehe Aufgabenstellung zur “Panic”) gibt’s eigentlich keine Probleme.
Und globale Variablen sind auch ok - wir schreiben hier immerhin ein BS!


Sie haben Recht. Der Treiber ist keine normale Klasse.

Meine Frage ist, ob man einen Treiber dynamisch anlegen und ins System registrieren kann.

Meine Meinung nach, das Kernel muss in der Lage sein, malloc/free/new/delete zu verwenden.

Ist es in Zukunft möglich? Danke.


Wenn du Dir eine Speicherverwaltung schreibst, geht das sicher - ist schließlich dein Betriebssystem. Wird im Rahmen von BS aber normalerweise nicht gemacht…


Hi,

wie Sleipnir schon geschrieben hat - natuerlich ist das moeglich. Im Rahmen von OOStuBS werden wir es aber nicht vorgeben. Du kannst das gerne noch als Bonus draufsetzen, wir haben da nichts dagegen :]!

Wie ausserdem schon in
[link]1. Aufgabe BS 07/08 - LS 4: Verteilte Systeme und Betriebssysteme - FSI Informatik Forum
geschrieben, ist dynamische Speicherverwaltung Teil von AOStuBS, was im Sommersemester in der Veranstaltung OSE gebaut wird.