שגיאות ADT ב- C(המשך)
מבנה
נתונים ואלגוריתמים
גישה המטפלת
בחריגות באופן דומה ב- Ada, Java
או C++, מוסיפה פונקציה אחת נוספת לכל
מחלקה. כמו בשפות אלה, החריגה יכולה להיתפס בכל רמה מתאימה בתוכנית, על ידי קריאה
לפונקצית השגיאה באותה רמה.
בגישה זו
כאמור, מוסיפים לכל מחלקה פונקציה אשר יכולה להיקרא בכל רמה מתאימה, על מנת לקבוע
האם קרתה שגיאה.
/*
vector.h */
typedef struct vector_t *vector;
typedef enum( NoError, SizeMisMatch,
NoMemory ) vector_error;
vector ConsVector( int dimension );
vector_error DeleteVector( vector a );
vector_error VectorError();
double DotProduct( vector a, vector b
);
היישום הוא
פשוט:
#include
"vector.h"
static vector_error ve = NoError;
vector_error VectorError() {
vector_error err;
err = ve;
ve = NoError;
return err;
}
char *VectorErrorString( vector_error
ve ) {
switch( ve ) {
case
NoError: return "No Error";
case
SizeMisMatch: return "Vector size mismatch";
case NoMemory: return "Insuff
memory for Vector";
default:
return "Unknown Vector Error";
}
}
double DotProduct( vector a, vector b )
{
if ( LengthVector(a) == LengthVector(b) ) {
....
}
else {
ve = SizeMisMatch;
return 0.0;
}
}
שים לב לתוספת
(האופציונלית) של פונקצית ה- VectorErrorString,
אשר יוצרת מחרוזת מודפסת המסבירה את השגיאה. דבר זה דומה למתודת perror
() המדפיסה את שגיאת ה- O/I
האחרונה כמחרוזת (אך שים לב כי Perror
()
מפרה את תכונת השימוש מחדש שהוצעה כאן כאשר המחרוזת יוצאת לפלט
הסטנדרטי ולכן חסרת תועלת בסביבות כגון GUI,
שבהן ה- stdout עשוי לא להיות יעיל).
כעת ניתן לקרוא
למתודת VectorErrror ()
מכל מקום בתוכנית, לאחר שמתודות מחלקת Vector
נקראו, והסביבה מספיק מוכרת על מנת לקבוע איזו פעולה אמורה להתבצע בתגובה לשגיאה.
double dp;
...
dp = DotProduct( a, b );
if( (ve = VectorError()) != NoError ) {
printf("Dot product error: %s\n",
VectorErrorString( ve ) );
}
המשך ל: הערות
לגבי שפות תיכנות חזור
ל: תוכן עניינים