שגיאות ADT ב- C
מבנה
נתונים ואלגוריתמים
אין למקם
הצהרות קלט/פלט כגון printf
בקוד הניתן לשימוש שוב ושוב, ואשר ממוקם ברמה נמוכה. אם הקוד ניתן לשימוש מחדש אז
יש להבטיח שהוא יתפקד בצורה תקינה בכל סביבה: פונקציות קלט/פלט הן בדרך כלל החלקים
בתוכנית שפחות ניתנים להעברה בצורה מסתגלת מסביבה אחת לאחרת. עדיף להשאיר פונקציות
אלה לרמות גבוהות יותר של התוכנית, שבהן ידוע בוודאות מהן סביבות הפעולה של
התוכנית.
אם אתה מעוניין
להגדיר פונקצית void,
הגדר אותה כמחזירה int,
או אף טוב יותר, כמחזירה enum.
פעמים רבות
ניתן יהיה להשתמש בערך המוחזר על מנת להצביע על שגיאה. למשל, כאשר בנאים מחזירים
מצביעים לבלוקים של זיכרון המוקצים עבור האובייקטים: מצביע NULL
מציין שגיאה.
int f( ... ) {
X a;
a = ConsX( ... );
if ( a != NULL ) {
/* No error */
....
return 1;
}
else
{
/* return an error value
to the next level up */
return 0;
}
}
פתרון אפשרי אחד
הוא להוסיף מצביע לקוד שגיאה לכל אחת מהמתודות:
/*
vector.h */
typedef struct vector_t *vector;
typedef enum( NoError, SizeMisMatch,
NoMemory, InvalidVector )
vector_error;
double AddVector( vector a, vector b,
int *error );
היישום יהיה:
#include
"vector.h"
double DotProduct( vector a, vector b,
vector_error *error ) {
if ( LengthVector(a) == LengthVector(b) )
{
....
}
else
{
*error = SizeMisMatch;
return 0.0;
}
}
פתרון זה,
המשיג את המטרה של קוד תקין, נחשב מסורבל מדי. הארגומנט הנוסף מוסיף גם לזמן
הביצוע.
setjmp/longjmp
ישנו מנגנון
בשפת C בשם setjmp/longjmp אשר מאפשר קפיצה מנקודה
שרירותית לנקודת מנהל מסוימת. למרות שניתן להשתמש במנגנונים אלה, הם יוצרים בעיות
ניידות, שמהן עדיף להימנע.
signal catching
גם תוכניות ב- UNIX יכולות להגדיר "תופס" (catcher)
עבורsignal. מנגנון זה תוכנן על מנת לאפשר להורה ב- UNIX אפשרות
של בקרה על בניו, ולכן זהו אולי מנגנון מוגזם לטיפול
בבעיה שהמשתמש יכול לתקנה בקלות - כמו פתיחת מספר גדול מדי של חלונות המבזבזת את
כל הזיכרון הנגיש!
המשך ל: עוד על שגיאות ADT ב- C חזור
ל: תוכן עניינים