C++ assert
-
Guten Tag ich hätte mal eine frage und zwar muss ich für die Uni ein programm schreiben indem ich ziemlich viel mit assert arbeite allerdings stelle ich immer die gleiche zusicherung an die gleichen variablen und da ich es mühsam finde immer an jede stelle meine zusicherung zu schreiben wollte ich fragen ob man das in der cpp datei nicht irgendwie am anfang mahcen kann das es so zusagen für alle variblen gilt. hier mal ein kleiner ausschnitt meines codes
funktion.cpp
#include "funktionen.h"
#include <cassert>
#include <iostream>
#include <math.h>unsigned int Plus(unsigned int a, unsigned int b) {
assert(a >=0 && a <=65535);
assert(b >=0 && b <=65535);
for (unsigned int i=1;i<=b;i++) {
a++;
}
return a;
}unsigned int Minus(unsigned int a, unsigned int b) {
assert(a >=0 && a <=65535);
assert(b >=0 && b <=65535);
for (unsigned int i=1;i<=b;i++) {
a--;
}
return a;
}hoffe ihr wisst was ich meine und hoffe ich hab mich halbwegs verständlich ausgedrückt
thx
-
Vielleicht kannst du dir mit einem kleinem Makro ein wenig Tipparbeit ersparen...
#define MY_ASSERT_AB assert(a >=0 && a <=65535);assert(b >=0 && b <=65535); //später: unsigned int Plus(unsigned int a, unsigned int b) { MY_ASSERT_AB //... }
Oder, wenn es gerade 0-65535 ist, wählst du einfach einen Typen, der nur diese Werte zulässt (unsigned short int ist 2 Byte beim MS-Compiler).
-
Ich würde das wohl so machen ...
#define MYASSERT(x) assert((x) >= 0 && (x) <= 65535) ... MYASSERT(a); MYASSERT(b); ...
immerhin ein bisschen weniger Tipparbeit.
BTW, a>=0 wird sowieso immer durch den unsigned-Typ erfüllt, das brauchst du nicht extra anzugeben.
-
Na dann lieber gleich eine Funktion mit variabler Parameteranzahl...
-
kk sieht schon gut aus ich probiers gleich mal aus danke danke
-
okay hat funktioniert ich nehme mal an es gibt keinen vernünftigeren weg noch weniger code zu schreiben oder???
-
GastStud schrieb:
okay hat funktioniert ich nehme mal an es gibt keinen vernünftigeren weg noch weniger code zu schreiben oder???
Das Programmieren sein lassen?
Wie gesagt, wenn der Bereich bei deinen Funktionen wirklich immer und dauerhaft von 0-65535 gehen soll, dann nimm unsigned short int, damit sind andere Werte von vorneherein ausgeschlossen. Ansonsten finde ich eine Assertion-Zeile pro Funktion schon vertretbar.
-
kk danke dann für die hilfe
-
Hab nochmal eine kleine einwende
und zwar wenn ich unsigned short int verwende kontrolliert er doch nur meine eingangsvariablen (bei mir hardcoded)ob diese im gefordeten wertebereich liegen
und da spuckt er mir ja auch noch eine warnung aus wenn ich aber z.b 65530*3 oder 65530+100 rechne sieht er ja vorher noch nicht das ich den wertebereich überschreite und das führt doch dann dazu das mein porgramm irgendetwas unkontrolliertes macht und das ist doch eigentlich nie gut oder liege ich in meiner annahme falsch.
grüße
-
Ja, hast Recht. Wenn du dem Aufrufenden nicht traust und einen Überlauf fürchtest, dann nimm ein assert.
-
kk wollt nur auf nummer sicher gehen also nochmals vielen dank
Gruß cu