|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 11.10.2004, 12:06 Titel: [Visual C++] Asserts |
|
|
Die assert Funktion sollte eigentlich jedem bekannt sein. Sie bietet den einfachsten/schnellsten Weg um Werte zu überprüfen damit einige Fehler garnicht erst passieren. Ein kleines Beispiel für die Anwendung von asserts:
Code: | void func( int* ptr ) // Diese Funktion soll was mit p machen
{
assert( ptr!=0 ) // Man "behauptet", dass ptr!=0 ist.
//mach was mit ptr
} |
Wie sich assert verhält, wenn die Behauptung NICHT zutrifft (also im Beispiel ptr=0 ist), liegt daran, welches assert man verwendet.
Man kann das vom C++ (oder C) Standard vorgegeben Makro assert() benutzen (in der Header Datei <assert.h>) oder man Bastel es sich selbst. Ich bevorzuge diese Methode, da man sein assert noch um einige nützliche Funktionen erweitern kann.
Als Erstes braucht man ein assert Makro. Unser soll 2 Parameter bekommen. Einmal die "assertion" also die Behauptung, die Ausgewertet werden soll. Und eine Beschreibung des Fehlers, falls die Behauptung nicht eingehalten wird. Außerdem legt das Makro eine lokale variable names ignore an. Diese dient dazu um die Assertion zu ignorieren, falls der Benutzer das will. Zu guter Letzt überprüfen wir den Rückgabewert unserer assertFunction (mehr dazu später) und rufen bei Bedarf den Interrupt 3 auf (in Assembler "int 3"). Dieser lässt den Debugger genau an der Zeile des Fehlers anhalten.
Die Funktion assertFunction bekomtm einige parameter:
expression: true->Behauptung ist wahr
file: Die Datei, in der der Fehler auftritt. (steht immer in __FILE__)
line: Die Zeile, in der der Fehler auftritt. (steht immer in __LINE__)
ignore: Ein Zeiger auf die lokale ignore Variable.
description: Die Fehlerbeschreibung
Sollte die Behauptung nicht wahr sein, wird der Fehler ausgegeben und der Benutzer wird gefragt, ob er diesen Fehler demnächst ignorieren möchte (Dazu dient die ignore Variable). Wenn ja geben wir true zurück, was das Makro dazu veranlässt den debugger NICHT anzuhalten. Sehr praktisch, wenn das assert nur als Warnung dienen soll, und in einer Schleife aufgerufen wird.
Sollte er den Fehler nicht ignorieren wollen, geben wir true zurück, und der Debugger hält somit an der Stelle des Fehlers an.
So nun ein komplettes Beispielprogramm. Die assertFunction kann man ja beliebig anpassen und z.B. eine Messagebox anzeigen.
Code: | #include <iostream>
#include <string>
using std::string;
#ifdef _DEBUG
#define assert( assertion, description ) \
{ static bool ignore = false; \
if( !ignore ) { \
if( assertFunction( (int)(assertion), __FILE__, __LINE__, &ignore, description ) ) \
_asm{ int 3 } \
} }
#else
#define assert( expression, description )
#endif
bool assertFunction( bool expression, const char* file, int line, bool* ignore, const char* msg="" )
{
std::string input;
if( expression ) return false;
std::cout << "Oh my god we got an error:" << std::endl;
std::cout << "File: " << file << std::endl;
std::cout << "Line: " << line << std::endl;
std::cout << "Message: " << msg << std::endl;
std::cout << "Ignore (y/n)? ";
std::cin >> input;
if( input == "y" || input == "Y" )
{
*ignore = true;
return false;
}
return true;
}
int main()
{
while( true )
{
char* test = 0;
assert( test, "ein assert test" );
}
return 0;
} |
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.10.2004, 12:18 Titel: |
|
|
geht klar, Überschrift geändert und Einleiteabschnitt gelöscht, sonst alles beim alten geblieben. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
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
|