BCB Makros
-
ich suche nach einer Möglichkeit programmtechnisch die aktuelle Zeilennummer zu ermitteln.
Beispiel. Ich habe sagen wir eine *.cpp-Datei mit 10000 Zeilen.
Zu Debugzwecken möchte ich, dass wenn in Zeile 321 oder 7856,... ein bestimmtes Ereignis passiert, ein Protokoleintag erstellt wird mit der Nummer der Zeile.ich dachte an so was, wie ein BCB Makro
-
Einen Haltepunkt mit Bedingung setzen (Rechtsklick auf den roten Punkt)?
Oder meinst du unabhängig von der IDE? Dann wirst du wohl um eine if-Abfrage an der entsprechenden Code-Zeile nicht herumkommen.
-
ich glaube ich weiß was du meinst.
Das funktioniert nicht nur mit dem BC++ Builder.
Ist glaube ich sogar im Standard von "C".Hier mal etwas Beispielcode
#define DEBUG_MSG( s ) debug_msg( s, __LINE__ ) void debug_msg( char *pMsg, int iLine ) { printf( "%s @ line : %i\n", pMsg, iLine ); }; ... ... debug_msg( "Eine Meldung" );
Bye Peter.
-
es muss ungefär so aussehen
void TForm1::Methode1() { try { tu_irgendwas(); } catch(Exception &e) { schreibe_inprot_datei(zeileno_die_ich_suche, fehler_text); } }
und ausgabe dann in der datei so:
Meine gewünschte Nummer
||
\/
...
7853: Fehler blablabla
4554: Fehler blublublu
....
-
@__Peter
genau das habe ich gesucht.
Danke!
-
Ich habe dazu eine Exception-Klasse erstellt, die von Exception ableitet. Das ganze sieht dann ungefähr so aus:
class ExceptionEx : public Exception { private: AnsiString file_; int line_; public: ExceptionEx(const AnsiString & msg) : Exception(msg) { } const AnsiString & getFile() const { return file_; } int getLine() const { return line_; } static ExceptionEx * createException(ExceptionEx *, const char * file, int line){ e->file_ = file; e->line_ = line; return e; } }; // Exception vom Typ T (kann ExceptionEx oder Nachkomme sein) und Nachricht msg auslösen #define THROW(T,msg) (throw ExceptionEx::createException( (ExceptionEx*)new T(msg), __FILE__, __LINE__)
-
hallo,
@Xqgene: das was du willst ist in cpp sehr wohl vorhanden, man nennt es assertions, das sind annahmen... wenn etwas bestimmtes geschieht kann man darauf reagieren, der vorteil gegenüber einer if ist hierbei, dass man die
assertions mit einer compilerdirektive quasi aus dem quelltext entfernen (werden dann nicht mehr mitkompiliert, sind aber noch vorhanden) kann, wenn man sie wieder braucht, wird einfach die direktive auskommentiert...mfg
murphy
-
hallo,
hier noch ein kleines assert beispiel, es zeigt auch wie von dir gefordert, die zeilennummer etc. an wo der fehler geschah, also genau das was von Xqgene
anfangs gefordert, allles ohne if und sonstigen schnickschnack (die fehlgeschlagene annahme geschah an):void AddWas(int val) { assert (val != 0); } void __fastcall TForm1::Button1Click(TObject *Sender) { AddWas(0); }
mfg
murph