שגיאות 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           חזור ל: תוכן עניינים