![]() |
.. (לתיקייה המכילה) | |
האם צריך לתמוך בביטוי מהצורה *** או האם זו שגיאה? | |
צורת החשיבה בפרוייקט הזה צריכה להיות - מה המשתמש היה מצפה מהתוכנה שלנו לו היא הייתה "מסחרית"? בכל מקרה של דילמה, נסו לחשוב מנקודת המבט של המשתמש, וממשו את ההתנהגות שסביר להניח שהוא יצפה לה. |
לגבי שמות שמורים, האם פונקציות/פקודות שלא מומשו הם שמות שמורים? | |
כל הפקודות והפונקציות בסעיף 2.5 של הפרוייקט הם שמורים, בין אם מימשתם אותם או לא, ולא ניתן להגדיר משתני גרפים בשמות אלה. לגבי פונקציות/פקודות מתקדמות (כלומר save ו-load), אלו יהיו שמורים רק אם מימשתם אותם בפועל. |
באיזו גרסה של C++ יש לתכנת את הפרוייקט? | |
הפרוייקט ייבדק בקומפיילר של C++11, כפי שנעשה עבור תרגילי הבית. |
בפקודה שהמשתמש מקליד, האם מותרים רווחים בין X ל-Y? | |
כן. מותרים רווחים בין *כל* שני אלמנטים אפשריים (חוץ מבתוך שם של פקודה/משתנה/קודקוד). |
האם שם של קודקוד יכול להיות ריק? האם יכולים להופיע כמה פסיקים רצופים בהגדרה של גרף? | |
לא. פסיק אמור להפריד בין שני אלמנטים לא ריקים. |
האם התו האנכי '|' הוא חובה בביטוי של גרף? | |
לא, בגרף בלי קשתות הוא אופציונלי. |
האם רווחים בקלט יכולים להיות גם טאבים? | |
לא - אפשר להניח שלא יהיו תווי \t (טאב) בטסטים. כמו כן אין להגיש קבצי טסט עם טאבים. |
לא למדנו איך לכתוב parser | |
אין משהו מיוחד לדעת לגבי כתיבת parser, כלומר, קוד שמקבל מחרוזת ומנתח אותה. לשם פתרון הפרוייקט מספיק להשתמש בכלים שקיימים ב-std::string (לניתוח ופירוק מחרוזת לחלקים) וקצת פונקציות מ-cctype (לזיהוי תווים ספציפיים). למחלקת std::string יש כמה מתודות שימושיות לעבודה עם המחרוזת, ואנחנו ממליצים פשוט לעבור על הפונקציות שהמחלקה הזו מספקת. שימו לב שלא להשתמש במתודות שהן של c++14 ומעלה. יצויין שהפתרונות שנכתבו על ידי צוות הקורס משתמשים אך ורק בשני אלה לפתרון התרגיל. |
לא למדנו איך לממש shell | |
אין שום דבר מיוחד ב-"shell" שלא למדנו. התוכנית צריכה לקרוא קלט מהמשתמש, לעבד אותו, להדפיס פלט, וחוזר חלילה. הכלים לעשות זאת מוכרים לכם. הדבר היחיד לשים לב אליו הוא לא להדפיס ירידת שורה אחרי הדפסת המחרוזת Gcalc> והנה, קיבלתם shell. |
יש לי שגיאת קומפילציה / בעיה במימוש / שאלה על תכן / איך להתמודד עם הפרויקט | |
לצערנו, לא נוכל לענות על שאלות כאלו (מדובר במבחן). מעבר לכך יש לכם (אנו מקווים) את מלוא הכלים להתמודד עם המשימה - במידת הצורך, חיזרו על הפרקים המתאימים של החומר והפתרון שלכם לתרגילי הבית. |
האם אפשר להשתמש במחלקה XXX / בפונקצייה YYY מהספרייה הסטנדרטית של C++? | |
כן. אם זה בספרייה הסטנדרטית של C++ (עד וכולל C++11) אפשר להשתמש בזה. יודגש עם זאת שלא חייבים ספריות מתקדמות של C++ כדי לפתור את הפרוייקט, הפתרונות של צוות הקורס למשל משתמשים רק בספריות שלמדנו או שמוזכרות בתאור הפרוייקט. |
האם אותו קודקוד או קשת יכולים להופיע פעמיים בתוך הגדרה של גרף? | |
כתיבה של אותו קודקוד או אותה קשת פעמיים בתוך הגדרה של גרף היא שגיאה. |
מה לעשות אם התוכנית נקראית עם מספר שונה מ-0 או 2 של ארגומנטים? | |
זו שגיאה פטאלית, יש לכתוב הודעת שגיאה ל-stderr ולסיים את התוכנית. |
האם מותר לשלב את פקודת load בתוך ביטוי מורכב יותר? | |
הפקודה load היא ביטוי לכל דבר, כיוון שיש לה ערך. לכן, אם מימשתם ביטויים מורכבים (סעיף 4.1) ניתן לשלב אותה בתוך ביטוי מורכב יותר - לפי התכונות שבחרתם לממש מהסעיף הזה. |
האם מותר לשלב השמה, או אחת מהפקודות print, reset וכו' פרט ל-load בתוך ביטוי מורכב יותר? | |
לא, רק את load. |
האם יכולות להופיע כמה פקודות באותה שורה? | |
לא. בכל שורה תופיע פקודה אחת בדיוק ללא תוספות (עד כדי רווחים). אם יש המשך לאחר הפקודה (פרט לרווחים) זו שגיאת סינטקס ולא מבצעים את הפקודה. |
שורת החילול של SWIG לא עובדת לי בשרת | |
קובץ המטרה צריך להופיע בסוף השורה כך: swig -python -o graph_wrap.c graph.i |
האם פקודה יכולה להופיעה מוקפת בסוגריים? | |
לא. סוגריים יכולים להקיף אך ורק ביטוי שיש לו ערך. |
האם הפרמטר ל-delete יכול להיות ביטוי? | |
לא, רק שם של משתנה. |
האם אגף שמאל בהשמה יכול להיות מוקף סוגריים? | |
לא, השמה צריכה להיות ישירות לתוך שם של משתנה (עד כדי תווי רווח). אגף שמאל של השמה איננו ביטוי ולכן התמיכה בסוגריים איננה רלוונטית לגביו. |
האם קודקודים יכולים לקבל שמות של שמות הפונקציות שהן מילים שמורות? (למשל print/reset...)? | |
כן, אין מגבלה של שמות שמורים לקודקודים. |
שורת ההידור של ממשק פייתון מסעיף 4.4.ג נכשלת לי ללא std=c++11-. האם אפשר להוסיף את הדגל? | |
כן. זה קורה כי השתמשתם ב-++C בממשק של הספרייה libgraph.a. לא התכוונו שתעשו את זה, אבל זה מותר. |
קישור של קובץ הספרייה graph.so_ נכשל עם ההוראה להוסיף את הדגל fPIC- להידור של הקבצים המרכיבים את libgraph.a, הודעה כמו "... can not be used when making a shared object; recompile with -fPIC" | |
יש להוסיף את הדגל לפקודות ההידור של הקבצים המוכלים בספרייה. |
האם מותר לעשות load בקובץ הבדיקה שמגישים | |
כן. אם אתם מספקים קבצים לטעינה הם צריכים להיות עם סיומת gc. ולהיות ממוקמים בשורש ההגשה. בטעינה הניחו שהם בתיקייה הנוכחית. |
עם המהדר החדש אני מקבל הודעה על דליפות זיכרון בתוך ספריית זמן הריצה 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1 at 0x4C29BC3: malloc (vg_replace_malloc.c:299) by 0x4EBF14F: pool (eh_alloc.cc:117) by 0x4EBF14F: __static_initialization_and_destruction_0 (eh_alloc.cc:244) by 0x4EBF14F: _GLOBAL__sub_I_eh_alloc.cc (eh_alloc.cc:307) by 0x400F992: _dl_init (in /usr/lib64/ld-2.17.so) by 0x4001179: ??? (in /usr/lib64/ld-2.17.so) | |
זה בסדר. תוודאו שאין דליפות שמגיעות מהקוד שלכם. אתם יכולים להיפתר מההודעה הזאת אם תיצרו קובץ עם התוכן הבא { dl_init_suppression Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:pool fun:__static_initialization_and_destruction_0 fun:_GLOBAL__sub_I_eh_alloc.cc fun:_dl_init obj:/usr/lib64/ld-2.17.so } ותספקו ל-valgrind את המסלול אליו עם דגל --suppressions=<filename> |
האם הפרמטר של delete יכול להיות גרף לא מוגדר? | |
לא. הפרמטר חייב להיות גרף מוגדר. |
האם שם קובץ בפקודת save/load יכול להכיל תווי סוגריים '(' או ')'? | |
לא. באופן כללי שם קובץ יכול להכיל כל תו חוץ מסוגריים ופסיקים. ניתן גם להניח שבטסטים שלנו לא יופיעו שמות קבצים עם תווי סוגריים או פסיקים, כיוון שהדבר עלול לגרום לדו-משמעות בסינטקס. |
האם שם קובץ בפקודת save/load יכול להכיל רווחים? | |
בעיקרון כן. שם קובץ יכול להכיל רווחים *פנימיים*, כיוון שהם תו חוקי בשם קובץ (כאמור, כל תו הוא חוקי חוץ מסוגריים ופסיקים). עם זאת, שם קובץ אינו יכול להכיל רווחים בהתחלה או בסוף, בשל הסינטקס של הפקודות במחשבון - רווחים כאלו מפרידים בין האלמנטים של הפקודה עצמה ואינם נחשבים חלק משם הקובץ. |
האם הקובץ הבינארי עשוי להכיל תוכן כלשהו אחרי תוכן של גרף חוקי? כלומר, האם צריך לבדוק שאין תוכן נוסף אחרי שטענו ממנו גרף? | |
לא, אנחנו לא נבדוק מצב של קובץ שמכיל גרף חוקי ולאחריו תוכן נוסף. |
מה אמורים לעשות במקרה שהמשתמש מקליד שורה ריקה / שורה שמכילה רק רווחים? | |
לבחירתכם. אנחנו לא נבדוק קלט ריק בטסטים שלנו. הכוונה המקורית הייתה שהתוכנה תתעלם מקלט כזה (כלומר לא תדפיס דבר ותמשיך לפקודה הבאה, כמו ב-shell אמיתי), אבל לאור אי הבהירות, אנחנו לא נכלול מצב כזה בבדיקות שלנו. |
מה ה-prompt הנכון? עם אות c קטנה או גדולה? | |
ה-prompt הנכון הוא לפי מה שכתוב במסמך הפרוייקט הרשמי, כלומר Gcalc עם c קטנה. קבצים אחרים שפרסמנו יתוקנו במידה ויש בהם טעות. |
האם הקודקודים/קשתות בקובץ בינארי צריכים להכתב אליו בסדר מסויים? | |
לא, לא דרשנו סדר מסויים ולכן הם יכולים להופיע בכל סדר בקובץ (כל עוד הפורמט הכללי של הקובץ נשמר). |
האם XXX הוא שגיאה פטאלית? | |
בדרך כלל לא. אם אפשר באופן סביר להדפיס הודעת שגיאה ולהמשיך את ריצת התוכנית, זו אינה שגיאה פטאלית. שגיאה היא פטאלית רק אם היא כזו שאין כל דרך להתאושש ממנה ונדרש לסיים את ריצת התוכנית. |
כאשר אני מנסה לשרשר את מסלול המהדר למשתנה הסביבה, אני מקבל את ההודעה | |
השגיאה נובעת כנראה כי מתחברים ל-shell מסוג cshell במקום bash. אפשר לבדוק זאת ע"י הרצת echo $0 כדי לפתור זאת ניתן לעבור לעבוד ב-bash ע"י הרצת הפקודה bash ניתן גם לקבוע את bash להיות ברירת המחדל, באופן הבא: תתחברו לשרת lux.technion.ac.il עם אותו שם משתמש וסיסמה כמו ב-csl3, תריצו את הפקודה chsh ותזינו את bin/bash/ בתור ה-shell החדש. השינוי צפוי להשתקף בשרת csl3 לאחר כחצי שעה. |
אילו קבצים צריך למחוק make clean? | |
כל קובץ שנוצר כתוצאה מפקודת הבנייה, דהיינו מהפעלת כלל makefile |
כיצד סופרים שורות לודא שלא חורגים מסף השינויים להגשה החוזרת? | |
1. מזרימים את הפלט של diff ל-wc ככה `diff oldfile newfile | grep "^>" | wc -l` 2. סוכמים על כל הקבצים 3. סוכמים את הפלט של wc -l על כל הקבצים 4. מחשבים את יחס השינויים מומלץ לא להתקרב למגבלה בכל מקרה - ההגשה החוזרת לא מיועדת לכתוב מימושים חדשים, אלא רק לתקן טעויות נקודתיות. |
1. האם 5% השורות שמותר לשנות הם 5% מכל השורות של הפרויקט, כולל כל הקבצים h, cpp, גם אלה שיצרנו לקראת החלק של הפייתון (הכוונה ל cpp ולא ל.i)? | |
1. כולל כל הקבצים. עדכון: רק קבצי הקוד - דהיינו לא כולל את מקרה הבדיקה שהוגש, וגם לא את design.pdf, אבל כולל ה-Makefile וקובץ i. 2. אם ההגשה החוזרת נדחית הציון הקודם נשאר. לא מומלץ להתקרב לסף - ההגשה החוזרת מיועדת רק לשינויים נקודתיים. 3. לפי ההתנהגות של diff - צריך להריץ diff ולראות. מומלץ מאד להוריד את ההגשה מה-GR ולהשוות אליה כדי לודא שלא יהיו יותר שינויים מהמצופה וההגשה תידחה. 4. כן, שורות ה-Makefile נספרות במניין השינויים. |
עדיין יש לי timeout בבדיקה XXX. | |
אם הפתרון לא סיים במגבלת הזמן זו שגיאה, גם אם זה לא בגלל לולאה אינסופית. מגבלת הזמן (המעודכנת) נקבעה כך שפתרון סביר יעמוד בה. אם פתרון לא עומד בה - משמע הוא שגוי ביחס למה שלמדנו בקורס, סביר להניח - ממשקים לא יעילים, בפרט העברה by value במקום by reference / אי שימוש במבנים של הספרייה הסטנדרטית / שימוש במבנים של הספרייה הסטנדרטית שחושפים ממשק לא מתאים לבעיה. |