V_checkBoundaries
FunktionKonsistenzprüfung von verlangter und tatsächlicher Vektor-/Matrix-Größe
Syntax C/C++#include <Veclib.h>
void V_checkBoundaries( void *X, ui size, int FlagRW, char *funcname );
Pascal/Delphiuses Veclib;
procedure V_checkBoundaries( X:Pointer; size:UIntSize; FlagRW:Integer; funcname:PChar );
BeschreibungDer häufigste Grund für schwer zu findende Fehler in Vektor- und Matrix-Berechnungen sind falsche Dimensions-Parameter. Durch sie können die Vektor-/Matrix-Grenzen überschrieben oder überlesen werden. Hierdurch wiederum wird der Heap beschädigt, was letztlich zu Fehlern und Abstürzen oft viel später im Programmablauf führt. Durch den Abstand zwischen Ursache und Absturz lässt sich die Ursache solcher Fehler oft nur sehr mühsam ermitteln. Aus diesem Grund bietet OptiVec Debug-Bibliotheken mit Prüfung der Dimensions-Konsistenz: (VCF4WD.LIB für Borland / CodeGear C++, OVVC4D.LIB für Visual C++, bzw. die units in LIB4D für Delphi). In diesen Debug-Bibliotheken ruft jede Vektor- oder Matrix-Funktion V_checkBoundaries auf, um für alle als Parameter erhaltenen Vektoren und Matrizen deren tatsächliche Größe mit den in den Aufrufparametern (size, ht, len) genannten Werten zu vergleichen. Im Falle von Inkonsistenzen werden Warnungen und/order Fehlermeldungen ausgegeben. Auf diese Weise ist es wesentlich einfacher, eventuell zu Speicherfehlern führenden Code zu identifizieren und zu korrigieren.
Obwohl der Hauptzweck von V_checkBoundaries in der internen Anwendung durch die Debug-Bibliotheken besteht, kann diese Funktion auch in Benutzerprogrammen für eigene Konsistenzprüfungen eingesetzt werden.

Eingabe-Parameter von V_checkBoundaries:
XDie Definition als generalisierter Zeiger (void * in C/C++, Pointer in Pascal/Delphi) bedeutet, dass diese Funktion jeden Vektor bzw. Matrix als Argument akzeptiert, unabhängig von ihrem Datentyp.
sizeDie Größe in Bytes, bis zu der der betreffende Vektor bzw. die betreffende Matrix gelesen oder geschrieben werden soll
FlagRWBit 0 dieses Parameters zeigt Lese- (0) oder Schreibzugriff (1). Falls ein Vektor sowohl gelesen als auch geschrieben wird, wird Schreiben (1) angezeigt.
Bit 1 gibt an, ob X ein Vektor (0) oder eine Matrix (1) ist.
Z.B. wird ein nur gelesener Vektor durch FlagRW = 0 angezeigt, während eine zu schreibende Matrix durch FlagRW=2+1 angezeigt wird.
funcnameEin String, der den Namen der untersuchten Funktion enthält
 
V_checkBoundaries identifiziert die folgenden Arten von Problemen und ergreift die erforderlichen Maßnahmen:
Gefundenes ProblemFehlermeldungWeitere Maßnahmen
X = NULL oder nilFuncName: read / write at address 0000.
(Lesen / Schreiben an Adresse 0000)
Sofortiger Programm-Abbruch
size = 0FuncName: Function called with size = 0 (must be ≥ 1)
(Funktion mit size=0 aufgerufen - muss ≥ 1 sein)
Sofortiger Programm-Abbruch
size > VectorSizeFuncName: Boundary violation: vector / matrix starting at StartAddress, ending at EndAddress, is read / written up to OffendingAddress.
(Begrenzungs-Verletzung: Vektor / Matrix mit Start bei StartAdresse und Ende bei EndAdresse wird bis zu SchlechteAdresse gelesen / geschrieben.)
Programm wird weiter ausgeführt.
X ist ein Sub-Vektor, und size > RestlicheVektorGrößeFuncName: Boundary violation: subvector / submatrix StartAddress of BasicAddress, ending at EndAddress, is read / written up to OffendingAddress.
(Begrenzungs-Verletzung: Subvektor / Submatrix StartAdresse von BasisAdresse mit Ende bei EndAdresse wird bis zu SchlechteAdresse gelesen / geschrieben.)
Programm wird weiter ausgeführt.
X ist nicht als OptiVec-Vektor / Matrix alloziertFuncName: Warning: read / write of unallocated or non-OptiVec vector StartAddress
(Warnung: Lesen / Schreiben von nicht alloziertem oder Nicht-OptiVec-Vektor StartAdresse)
Programm wird weiter ausgeführt.
 
Falls Sie den Gebrauch von statischen Arrays oder von Arrays, die mit malloc oder den Speicherverwaltungsfunktionen der Windows API erzeugt wurden, nicht umgehen können, aber die zuletzt beschriebenen Warnhinweise nicht sehen möchten, können Sie sie abschalten mittels
V_setBoundaryCheckWarn( 0 );  (C/C++) oder
V_setBoundaryCheckWarn( FALSE );  (Pascal / Delphi).
Hierdurch werden nur die Warnungen, nicht aber die Fehlermeldungen abgeschaltet.

Fehlerbehandlungkeine
RückgabewertX-Koordinate des Schwerpunkts
QuerverweisV_setBoundaryCheckWarn

VectorLib Inhaltsverzeichnis  OptiVec Home