Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 29. December 2006, 19:14

Titel: Problem mit Globalem Objekt
Beitrag von: RedEagle am 29. December 2006, 19:14
Hi
Ich habe eine Klasse, um Debug-Informationen auszugeben.
Jetzt mochte ich ein Objekt dierser Klasse zum debuggen mehrer Funktionen nutzen. Deshalb muss das Objekt Global sein.

Aufgrund der im "C++ Kernel" - Tutorial beschrieben Probleme habe ich diese "__main" und "__atexit" funktion übernommen (und auch aufgerufen) und meinen Link-script dementsprechend erweitert.

Zum Problem:
Ich Initialisiere das Objekt, und benutze. Sobalt ich aber eine Funktion verlasse, sind alle Informationen verloren, sodas ich bei jedem Funktionsaufruf / Funktion das Onjekt neu initialisieren muss. (maw.: es ist mehr oder Weniger Lokal)

Habe ich irgendwas falsch gemacht / nicht beachtet??

Schema:
Klasse objekt;

void funktion1()
{
 objekt.init("Test",0,0,0x0C);
 objekt.print("test");
 return;
}

void funktion2()
{
  /*test2 wird nur ausgegeben, wenn ich objekt neu initialisieren (sonst test "test2" an der Adresse 0x00000000*/
 objekt.print("Test2");
 return;
}






Titel: Re: Problem mit Globalem Objekt
Beitrag von: Termite am 29. December 2006, 21:17
Hi

was du da implementierst ist ein klasisches singelton pattern. Hast du mal versucht deine implementierung in einem normalen c++ projekt zu verwenden?



Auserdem würe ich das halten der Instanc der Klasse selber überlassen.

class Singelton
{
   private :
       Singelton () // Constructor private. darf von ausen nicht gerufen werden können
      {
 
      }
   
      static singelton * pInstance= 0; // eine Instance davon. anfangs null bis zur ersten verwendung

   public :
     Singelton* getInstance() // liefert die zentrale instanc zurück.
     {
         if (instance == 0)
         {
            pIstance = new Singelton();
         }
         return instance;
     }
}


der Syntax wie immer ohne Pistole. ( komm aus der java welt deswegen ggf die notation von pointern und ähnlichem ggf fehlerhaft)

ps. das Singelton Objekct muss als Pointer zurückg gegeben werden. Nicht per Value, da sonst copiert wird!
Titel: Re: Problem mit Globalem Objekt
Beitrag von: RedEagle am 29. December 2006, 21:48
 :?

vereinfachter aufbau meiner Klasse: (Habe backbuffer, und zahlreiche I/O-Funktionne mal rausgelassen)
class klasse
{
 public:
  klasse(){init(0x07,0,0);}
  ~klasse(){;}
 
  void init(BYTE farbe, BYTE xposition, BYTE yposition);

 private:
  BYTE *frontbuffer;
  BYTE color;
  BYTE x;
  BYTE y;
};

void klasse::init(BYTE farbe, BYTE xposition, BYTE yposition)
{
 x = xposition;
 y = yposition
 color = farbe;
 frontbuffer = (BYTE*)0xB8000;
}
Titel: Re: Problem mit Globalem Objekt
Beitrag von: bluecode am 30. December 2006, 14:28
@Termite: Naja, ich würd noch den Copy-Constructor und den = operator private machen, andernfalls kannste ja trotzdem noch kopien machen. Außerdem würd ich das Objekt als referenz bei getInstance zurückgeben lassen und im Kernel wohl eher ne statische Variable für die Instanz nehmen (zumindest solange kein new da ist).

@RedEagle: Welches "C++ Kernel" Tutorial, wie machst du des, welcher Compiler, wird der C-tor überhaupt aufgerufen?
Titel: Re: Problem mit Globalem Objekt
Beitrag von: RedEagle am 30. December 2006, 15:57
Das "C++ Kernel"-Tutorial auf LowLevel (von TeeJay glaub'ich)
Compiler: gpp
Ich habe mir die *.obj - Informationne wie im tutorial beschrieben ausgeben lassen (mit "objdump"), und dort waren, wie erwartet ctor und dtor vorhanden.
Titel: Re: Problem mit Globalem Objekt
Beitrag von: bluecode am 30. December 2006, 16:05
Wird den der Ctor überhaupt aufgerufen? Lass doch da mal ein Zeichen ausgeben oä...
Titel: Re: Problem mit Globalem Objekt
Beitrag von: RedEagle am 30. December 2006, 16:12
Ja, der Constructor wird direkt beim Systemstart ausgeführt.