AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Assertion

Ein Thema von day · begonnen am 16. Jun 2004 · letzter Beitrag vom 7. Jul 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Assertion

  Alt 17. Jun 2004, 12:50
Folgender Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Assert(False, 'Foobar');
end;
erzeugt folgende Messagbox:

Zitat:
---------------------------
Project1
---------------------------
Foobar (E:\Delphi\Programme\Unit1.pas, line 28)
---------------------------
OK
---------------------------
Das wird irgendwie mit einkompiliert. Deaktiviere ich die Assertions in den Projektoptionen ist bei D6 Personal die Anwendung 1 KB kleiner, als mit.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#12

Re: Assertion

  Alt 17. Jun 2004, 14:11
also um es mal klar zu stellen:
Assertions sollte man nur dann benutzen, wenn eine Bedingung im Programmablauf nie falsch sein darf. Zudem sollte man bedenken, dass ein Aufruf auf Assert lediglich eine Ueberpruefung sein sollte und kein Funktionsaufruf, kompiliert man das Projekt naemlich ohne Assertions, wuerde diese funktion niemals ausgefuehrt werden. Also bedingungen in Assertions duerfen niemals den Programmablauf beeinflussen, das Programm muss genauso funktionieren, wenn man den Assert() aufruf einfach weglassen wuerde.

Delphi-Quellcode:
var
  a, b: Integer;
begin
  a := 2 + Random(198);
  b := a div 2; // b ist demnach niemals 0, da a mindestens 2 ist
  Assert(b <> 0, 'Dieser Fehler darf niemals auftreten!');
end;
Das waere zum Beispiel eine Anwendung, wenn auch etwas schwachsinnig in diesem Fall aber normalerweise sollte b in diesem Fall immer ungleich 0 sein (ist es auch), falls nicht stimmt etwas mit dem algo nicht.

Ein anderes Beispiel:
RICHTIG:
Delphi-Quellcode:
var
  hash: String;
begin
  ...
  hash := RegisterAndGenerateFileHash(hFile); // die Funktion sollte immer einen 8-stelligen String zurueckliefern, auch im Falle eines Fehlers
  Assert(hash <> '', 'RegisterAndGenerateFileHash() hat irgendwie einen leeren String zurueckgegeben!');
end;
FALSCH:
Delphi-Quellcode:
var
  hash: String;
begin
  ...
  // die Funktion sollte immer einen 8-stelligen String zurueckliefern, auch im Falle eines Fehlers
  Assert(RegisterAndGenerateFileHash(hFile) <> '', 'RegisterAndGenerateFileHash() hat irgendwie einen leeren String zurueckgegeben!');
end;
Dieses Beispiel zeigt die falsche Anwendung von Assertions, da die Funktion RegisterAndGenerateFileHash niemals aufgerufen wuerde, wenn man das Projekt ohne Assertions kompiliert.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#13

Re: Assertion

  Alt 17. Jun 2004, 14:17
Zitat von Dax:
Aber wie geht das? Da muss der Compiler doch zur Compilezeit das ganze einfügen (Zeilennummer usw.)...
Richtig, das wird vom Compiler direkt als String fest in die EXE mit einkompiliert.

Zitat von Dax:
Wo ich bei VirtualDub draufgestoßen ist's ähnlich: wenn das Programm crasht, disassembliert es sich und gibt Zeilennummer und Art des Fehlers an. Aber wie geht das mit disassemblen zur Laufzeit und Co?
Das Programm installiert einen Exception handler (mit der Funktion SetUnhandledExceptionFilter()). Falls jetzt eine Exception auftritt, die nicht behandelt wurde, wird eine Callback funktion mit allen noetigen Informationen aufgerufen. Darin kann beispielsweise die Anwendung disassembliert werden und die aktuelle Position errechnet werden. Die Datei und Zeilennummer wird aus den Debug-Informationen ermittelt, die in einer Section hinterlegt sind, dabei wird die naechst kleinere oder gleiche Adresse an der die Exception aufgetreten ist in der Liste gesucht. Dann weiss man in welcher Datei und in welcher Zeile die Exception aufgetreten ist. vielleicht sagt dir das tool addr2line fuer gnu projekte was.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#14

Re: Assertion

  Alt 17. Jun 2004, 14:25
Irgendwie wäre doch dein Beitrag GENAU das Richtige für die Code-Lib, oder nicht?
Julian J. Pracht
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#15

Re: Assertion

  Alt 7. Jul 2004, 13:29
@w3seek: Nee, sagt mir nix. Aber wie geht das denn, mit dem disassembling?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz