JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

[Visual C++] Asserts

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
xardias
JLI Master


Alter: 34
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 11.10.2004, 12:06    Titel: [Visual C++] Asserts Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 33
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 11.10.2004, 12:18    Titel: Antworten mit Zitat

geht klar, Überschrift geändert und Einleiteabschnitt gelöscht, sonst alles beim alten geblieben.
_________________
http://www.C3-Soft.de
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 -> FAQ 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