שאלות תרגיל בית 1

ELECTION_ERROR

ELECTION_ERROR

על ידי נעם דובדבני בתאריך
מספר תגובות: 3

שלום,

ראיתי בפוסט-https://moodle.technion.ac.il/mod/forum/discuss.php?d=511556 שבקישתם  במקרה של שגיאה בפעולות פנימיות של C , להחזיר ELECTION_ERROR.

פירסום השגיאה ELECTION_ERROR פורסם ב3 למאי, (לפני חמישה ימים) הרבה אחרי שיחרור התרגיל.

הקוד שלי מתבסס על בדיקת הפוקנציות הפנימיות והחזרת סטטוס של ELECTION_OUT_OF_MEMORY במידה ומתקיימת שגיאה.

שינוי של הקוד להתאמה  הוא שינוי מסיבי , כיוון שישנם STRUCT פנימי אשר הפונקציות שלו מחזירות ערך בוליאני ( FALSE) במקרה של שגיאה וNULL במקרה של שגיאה.

כל שינוי כזה מעבר לזמן הרב שיקח ( שגם ככה אין) יגרור הוספת שורות קוד רבות וסירבול הקוד, כיוון שמהתחלה לא תוכנן להחזיר ערך שגיאה כזה.

האם ניתן להישאר עם ערך השגיאה שרשמנו ELECTION_OUT_OF_MEMORY?

 

בתגובה ל: נעם דובדבני

תשובה ל: ELECTION_ERROR

על ידי נעם דובדבני בתאריך
אני ארחיב טיפה בקשר לזה...
STRCPY- מחזיר ערך שגיאה לפי הגדרה כאשר ה DEST קטן מה SRC. אבל כיוון שהקצאת ה DEST התבצעה על ידינו ב MALLOC ( ונבדקה כמובן) אז STRCPY לא יכול להיכשל ( בכל מקרה הסופנו ASSERT למקרה הצורך).
sprintf- מחזיר את גודל הערך המקוצה במעבר ל STRING. במידה ונכשל מחזיר 0. אנחנו משווים בין גודל ה INT שהמרנו לגודל שחזר, במידה ויש שגיאה, מחזירים *ELECTION_OUT_OF_MEMORY* ( שוב, השגיאה יכולה להתבצע אם לא הוכנס מספר או שגודל המחרוזת שהוקצע לא מספיק גדול, דבר שנבדק לפני הפעלת הפונקצייה).
atoi- במידה והמחרוזת אינה "מספרית", מחזיר 0. היות וכל האיברים הוכנסו על ידינו מ SPRINTF, הפונקצייה אינה יכולה להיכשל ( ביצענו הפרדה בין מקרה קצה שמוכנס האיבר "0" כמובן) בכל מקרה הכנסנו ASSERT על מנת להראות כי אנחנו מצפים לאיבר הזה.
הבעיה שלנו היא להבין עד לאיזה נקודה צריך לבדוק. הפונקציות הנ"ל יכולות להיכשל רק אם הכנסת הפרמטרים אליהם לא הייתה נכונה. אך כיוון שהפרמטרים הוקצו על ידינו ( ולא עד לידי הUSER). מרגיש לי שהשימוש הכנון הוא ASSERT ולא תוצאה אחרת. כי אנחנו מניחים שההכנסה שביצענו עובדת.
בתגובה ל: נעם דובדבני

תשובה ל: ELECTION_ERROR

על ידי אורטל כהן בתאריך
היי,
ערך שגיאה זה נוסף עקב פוסטים שהתקבלו בנושא. (בעיקר בעקבות מקרים שהוחזרו שגיאות שלא ניתן לסווג אותן לקודי שגיאות שנתנו בתרגיל - מקרים אלו לא יכולים להבדק בטסטים, אולם יכולים להבדק בבדיקה היבשה של חלק ב' ברטוב).
שימו לב ששגיאת ELECTION_OUT_OF_MEMORY - היא שגיאה של הקצאות זכרון (הזכרון בתוכנית מאיזושהי סיבה נגמר ולא ניתן להקצות זכרון) ולכן יש להחזיר שגיאה במקרה זה.
יש להשתמש ב-assert כפי שצוין בהרצאה.
בתגובה ל: אורטל כהן

תשובה ל: ELECTION_ERROR

על ידי אורטל כהן בתאריך
אני מבהירה - בעת שימוש בפונקציות ספרייה, במקרים בהם אתם בטוחים שלא תהיה שגיאה (כי אתם מניחים שהקלט תקין ושגיאה יכולה לנבוע רק מקלט לא תקין כגון strcpy) אתם יכולים להשתמש ב-assert.
אולם יש פונקציות ספרייה ששגיאה יכולה לנבוע מטעות שלא קשורה לקלט הפונקציה כגון malloc ואז יש להחזיר ערך שגיאה מתאים.