PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] Macht das Sinn?


pajofego
2006-07-19, 23:30:02
Hallo miteinander,

ich bin's mal wieder mit meinen nervigen Fragen rund um C/C++ :biggrin:

Ich bin gerade mal wieder dabei open source code bei mir zum laufen zu bringen und bin da auf etwas gestoßen, dass ich in der Form nicht ganz verstehe bzw. nicht ganz nachvollziehen kann.


...
assert(val >= 0.0f);
assert(val <= 1.0f);

// set it if it's out of range
if (val < 0.0f)
val = 0;
if (val > 1.0f)
val = 1;
...


Es geht um o.g. Code. Die Bereichüberprüfung von val liegt hier in doppelter Form vor (asser und if) oder nicht? Das Problem ist, dass wenn ich die assert Abfrage nicht auskommentiere, steigt das Programm frühzeitig aus!

Wozu ist so eine Konstruktion vorgesehen? Kann man die assert Abfrage via Befehl ausschalten - eine Bereichüberprüfung erfolgt ja im nachhinein - und eine assert freie Version compilieren zu können?

Danke,

Gruß

pajofego

Senior Sanchez
2006-07-19, 23:32:23
Asserts sind gedacht um schnell Bedingungen prüfen zu können, ohne aufwendig den Code ändern zu müssen.

Sobald eine Bedingung eintritt, beendet sich das Programm.

Die wurden mit Java 1.4 auch bei Java eingeführt aber ehrlich gesagt habe ich sie noch nie genutzt.

Oder an die Experten: Habe ich da jetzt was vergessen?

Xmas
2006-07-19, 23:46:10
pajofego[/POST]']Wozu ist so eine Konstruktion vorgesehen? Kann man die assert Abfrage via Befehl ausschalten - eine Bereichüberprüfung erfolgt ja im nachhinein - und eine assert freie Version compilieren zu können?
Genau, man kann assert() deaktivieren indem man NDEBUG definiert bevor man cassert/assert.h einbindet.

pajofego
2006-07-19, 23:58:44
Xmas[/POST]']Genau, man kann assert() deaktivieren indem man NDEBUG definiert bevor man cassert/assert.h einbindet.


#define NDEBUG
#include <assert.h>


Habe ich mal gemacht und neue compiliert. Das Programm steigt dennoch beim gleichen assert aus, d.h. die asserts bleiben weiterhin aktiv. Ich benutze Dev C++, gibt's da evt. ein Schalterchen das noch gesetzt werden muss?

Danke,

Gruß

pajofego

del_4901
2006-07-20, 00:21:57
probier mal


#undef NDEBUG
#define NDEBUG 1

Neomi
2006-07-20, 00:30:35
Natürlich ist das eine sinnvolle Konstruktion. Stell dir mal vor, du willst eine größere Datei irgendwo speichern, aber die Platte ist voll. Die Datei wird gar nicht erst gespeichert, also ist auch keine korrupte Datei auf der Platte, soweit ist alles gut. Als User willst du aber gerne noch eine Meldung haben, daß es nicht ging, auch wenn du nur die Möglichkeit hast, die Kenntnisnahme zu bestätigen.

Genau so ist es bei diesem Konstrukt. Die Korrektur der Variablen sorgt dafür, daß alles (was sich auf einen gültigen Wertebereich verläßt) trotz fehlerhaftem Wert trotzdem funktioniert. Im Debugmodus wird die Korrektur nicht stillschweigend durchgeführt, sondern dem Entwickler noch gesagt, an welcher Stelle ein Eingriff nötig ist.

pajofego
2006-07-21, 00:08:16
AlphaTier[/POST]']probier mal


#undef NDEBUG
#define NDEBUG 1

Hat leider auch nicht funktioniert! :confused:

Gruß

pajofego

del_4901
2006-07-21, 00:11:05
pajofego[/POST]']Hat leider auch nicht funktioniert! :confused:

Gruß

pajofego

Bist du sicher das dieses define vor Allen! includes aufgerufen wird?

pajofego
2006-07-23, 23:41:58
AlphaTier[/POST]']Bist du sicher das dieses define vor Allen! includes aufgerufen wird?

Aaaah! Danke, das war's! Hat zwar ein bissle gedauert, aber jetzt geht's ja endlich.

Gruß

pajofego