JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=6c267fdac8d3bbb62e1e542ae811d496Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Markos und ""-Zeichen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 15:45    Titel: Markos und ""-Zeichen Antworten mit Zitat

Also, ich möchte mir ien Makro bauen, das mir anzeigt in welcher Funktion ich mich befinde:
CPP:
void FUnktion()
{
MEINMAKRO
}

soll zu
CPP:
void FUnktion()
{
printf("code.cpp line 3");
}

werden. Dafrü gibt es ja die __FILE__ und __LINE__ Makros. (Gibts die eignelich auch für Funktion?). Mein Problem ist jetzt, das ich die ja in Anführungszeichen haben muss. Aus __LINE__ darf nicht 3 werden sondern "3". Nur irgendwie klappt das nicht, wenn ich im Makro "__LINE__" schreibe, wird __LINE__ nicht ersetzt, wenn ich \"__LINE__\" schreibe sagt er das Escape zeichen nicht erlaubt sind.
Ich hab echt kein Plan was ich sonst noch machen soll.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 16:03    Titel: Antworten mit Zitat

Patrick hat in seiner Funny Break Tutorialserie soetwas mit eingebaut. Solltest es dir vieleicht mal anschauen. Das steht ziemlich weit in der Mitte.
http://www.germangamedev.de/index.php?site=article&id=8

PS: Was ist mit Patrick, der schreibt gar nichts mehr? Seit dem Streit im Offtopic liest man gar nichts mehr von ihm.
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 16:07    Titel: Antworten mit Zitat

Der FunctionStack ist ziemlich klasse wenns ums debuggen geht, zusammen mit einem gescheiten Exception-System findest du so jeden Bug.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 16:30    Titel: Antworten mit Zitat

CPP:
#define C2W(value) L#value

#define E_START ExceptionManager::Instance().Start(std::string(C2W(__FUNCTION__)));


class ExceptionManager
{
public:
   static ExceptionManager& Instance()
   {
      static ExceptionManager Manager;
      return Manager;
   }

   void Start(std::string Funktionname)
   {
      m_FunktionList.push_back(Funktionname);
   }
[...]

Code:

error C2440: 'Typumwandlung': 'const unsigned short [13]' kann nicht in 'std::basic_string<_Elem,_Traits,_Ax>' konvertiert werden
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Ax=std::allocator<char>
        ]
        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig

Kapier ich net Sad
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 18:16    Titel: Antworten mit Zitat

Dragon hat Folgendes geschrieben:

PS: Was ist mit Patrick, der schreibt gar nichts mehr? Seit dem Streit im Offtopic liest man gar nichts mehr von ihm.

der wurde vom Chef gesperrt, nähere Infos kannst du von Patrick selber erfahren.

Jona hat Folgendes geschrieben:
Nur irgendwie klappt das nicht, wenn ich im Makro "__LINE__" schreibe, wird __LINE__ nicht ersetzt, wenn ich \"__LINE__\" schreibe sagt er das Escape zeichen nicht erlaubt sind.
Ich hab echt kein Plan was ich sonst noch machen soll.

Nimm doch einfach das Textumwandlungs zeichen # (net zu verwechseln mit dem Verknüpfungszeichen ## ). Also einfach:
CPP:
#define MAKESTRING( str ) #str

//...

cout << MAKESTRING(__LINE__)


Kannste natürlich auch einfach direktmachen, so:
CPP:
cout << #__LINE__; // oder dann #(__LINE__), solte aber das selbe sein


Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.03.2006, 19:13    Titel: Antworten mit Zitat

Code:

game.cpp(80) : error C2121: '#': Ungültiges Zeichen: Möglicherweise das Ergebnis einer Makroerweiterung
game.cpp(80) : error C2664: 'ExceptionManager::Start': Konvertierung des Parameters 1 von 'int' in 'std::string' nicht möglich
        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig



CPP:
#define MAKESTR( str ) #str

#define E_START ExceptionManager::Instance().Start(#( __LINE__ ));
#define E_RETURN ExceptionManager::Instance().Return();

class ExceptionManager
{
public:
   static ExceptionManager& Instance()
   {
      static ExceptionManager Manager;
      return Manager;
   }

   void Start(std::string Funktionname)
   {
      m_FunktionList.push_back(Funktionname);
   }


Wenn ich das MAKESTR Makro benutze, schreibt er irgendwie imemr nur __LINE__ statt der Linie oder dme Funktionsnamen oder was ich sonst benutezn will.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.03.2006, 12:48    Titel: Antworten mit Zitat

Das kann doch nicht so schweirig sein... Sad
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 438

Medaillen: Keine

BeitragVerfasst am: 31.03.2006, 14:46    Titel: Antworten mit Zitat

Das ist AFAIK nicht möglich. __LINE__ ist und bleibt eine Zahl. Der Compiler scheint das nicht umwandeln zu können.
Vlt. solltest du das ganze mit StringStreams machen, dann könntest du einfach nen unsigned long verwenden und Ruh is.
Gruß

FH
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 31.03.2006, 14:52    Titel: Antworten mit Zitat

jo, also eigentlich ist das doch das, was du willst oder?

das Makro MAKESTR() macht aus
CPP:
MAKESTR( xyz ) = "xyz"
also auch aus
CPP:
MAKESTR( __LINE__ ) = "__LINE__"


du willst aber, dass z.B. __LINE__ = 42 zu "42" wird? nagut, machs wie der FH gesagt hat:
CPP:
inline std::string GetLineStr(void)
{
       std::stringstream line;
       line << __LINE__;
       return line.str();
}

Das bringt zwar so net viel, weil der Compiler wenn er das net inline nimmt, die Zeile in der Funktion schreibt, aber ich denke das Prinzip sollter klar sein

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 11:10    Titel: Antworten mit Zitat

Also irgendwie klappt mein ganzes System noch nicht so gut:

CPP:
#ifndef _EXCEPTIONMANAGER_
#define _EXCEPTIONMANAGER_

#include "log.h"
#include <list>
#include <sstream>
#include <string>

class TempStackObject;

#define FUNCTION_STACK  TempStackObject StackObject(__FUNCTION__);
#define E_START         TempStackObject StackObject(__FUNCTION__);
#define E_RETURN

class ExceptionManager
{
public:
   static ExceptionManager& Instance()
   {
      static ExceptionManager Manager;
      return Manager;
   }

   void Start(std::string Funktionname)
   {
      m_FunktionList.push_back(Funktionname);
   }
   void Return()
   {
      m_FunktionList.pop_back();
   }
   void LogIt()
   {
      //std::list<std::string>::iterator It=m_FunktionList.back();
      //m_FunktionPath << m_FunktionList.back();
      m_FunktionPath << m_FunktionList.back() << " - ";
      //cLog::GetInstance() << LOGE(m_FunktionList.back());
      m_FunktionList.pop_back();
      
   }
   void MakeLog()
   {
      cLog::GetInstance() << LOGE("Exception aufgetreten bei:");
      cLog::GetInstance() << LOGE(m_FunktionPath.str());
      std::list<std::string>::iterator It;
      
      for(It=m_FunktionList.begin(); It!=m_FunktionList.end(); ++It)
      {
         cLog::GetInstance() << LOGE(*It);
      }
   }
protected:
   ExceptionManager()
   {
   }
   std::list<std::string> m_FunktionList;
   std::stringstream m_FunktionPath;
};



class TempStackObject
{
public:
   TempStackObject(std::string Name)
   {
      ExceptionManager::Instance().Start(Name);
   }
   ~TempStackObject()
   {
      if(std::uncaught_exception())
         ExceptionManager::Instance().LogIt();
      else
         ExceptionManager::Instance().Return();
   }
};

#endif


CPP:
#include "ExceptionManager.h"

void Funktion2()
{
   FUNCTION_STACK
   int *p=NULL;
   *p=5;
      //throw("haha");
}


void Funktion1()
{
   FUNCTION_STACK;
   Funktion2();
}

void Funktion0()
{
   FUNCTION_STACK
   Funktion1();
}


int main()
{
   FUNCTION_STACK
   try
   {
      Funktion0();
   }
   catch(...)
   {
      ExceptionManager::Instance().MakeLog();
   }
   return 0;
}


Das seltsame ist: Wenn ich die Exception selber werfe, bekomm ich folgenden Log-Eintrag:
Code:

Fehler   Exception aufgetreten bei:   
Fehler   Funktion2 - Funktion1 - Funktion0 -    
Fehler   main   

Der stimmt ja so auch. Wenn ich allerdings die ungülite Zeigeroperation mache kommt folgendes:
Code:

Fehler   Exception aufgetreten bei:
Fehler   Funktion2 - Funktion1 -    
Fehler   main   
Fehler   Funktion0   

Offensichtlich wurde der Destruktor von Funktion0 nicht aufgerufen. Warum nicht?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 11:36    Titel: Antworten mit Zitat

Also mein Compiler (gcc 3.4.5) wirft keine Exception bei *p=5;. AFAIK ist das Verhalten dann auch undefiniert und nicht, dass eine Exception geworfen wird. Ich würde mich also nicht bedingungslos auf solche Erweitertungen verlassen.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.04.2006, 13:04    Titel: Antworten mit Zitat

naja, es ist ja nciht so schlimm, weil bei Makelog ja die restlichen Funktionen auch mit geschreiben werden.
Jetzt hab ich allerdings in meinem Spiel das mal eingebaut, nur hängt er sich jetzt bei mir bei LogIt auf. Wenn ich innerhalb von LogIt die Zeile wo er die Funktion in in den Stringstream schreibt auskommentier, hängt er sich nicht auf. Warum?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum