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
|
Verfasst am: 30.03.2006, 15:45 Titel: Markos und ""-Zeichen |
|
|
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 |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 30.03.2006, 16:07 Titel: |
|
|
Der FunctionStack ist ziemlich klasse wenns ums debuggen geht, zusammen mit einem gescheiten Exception-System findest du so jeden Bug. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.03.2006, 16:30 Titel: |
|
|
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 _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.03.2006, 18:16 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.03.2006, 19:13 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 31.03.2006, 14:46 Titel: |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 31.03.2006, 14:52 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.04.2006, 11:10 Titel: |
|
|
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 |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 01.04.2006, 11:36 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.04.2006, 13:04 Titel: |
|
|
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 |
|
|
|