פורסם 2007 בספטמבר 2618 שנים טוב, אני די פנוי ומשועמם בשעה הקרובה, אז אם אתה רוצה באמת עזרה, תשלח לי את כל קבצי הקוד, מחולק למה שנתון ובלתי ניתן לשינוי, וכן לקטע הקוד שמצופה ממך להגשה, אולי כן אוכל לתרום משהו בדקות הקרובות, אם זה לא מאוחר מידיי...
פורסם 2007 בספטמבר 2718 שנים מחבר תודה רבה אחי , אבל כמו שהזכרתי מקודם,כבר שלחתי את העבודה כמו שהיא אז זה כבר לא רלוונטי.רק אם אתה יכול תציץ ב findprevious באחת ההודעות הקודמות ותגיד לי אם היא הגיוניתכי לפי מה שהבנתי היא מחזירה את האיבר הבא ולא את הקודם , כל המימוש שלה הזוי.
פורסם 2007 בספטמבר 2718 שנים הבעיה שם שאתה צריך לשלוח את האיבר הראשון, ואת האיבר שאתה רוצה למצוא לו קודם. תמיד שלחת את האיבר שאתה רוצה למצוא לו קודם גם כאיבר הראשון, וזה מה שגרם לבעיה.
פורסם 2007 בספטמבר 2718 שנים לגבי ה-FindPrevious יש בה כמה בעיות שאני רואה באופן מקומי, מה שמשפיע בהכרח על שימוש מאוד מסויים בה (אלא אם כן ניתן לשנותה):1. הפונקציה מקבלת (פרמטרים) את האלמנט הנוכחי ואת המצביע לרשימה, לכן על מנת למצוא את האלמנט הקודם ברשימה יש לשלוח בתור פרמטר את המצביע לתחילת הרשימה, ולא את המצביע לאיבר הנוכחי, מה שלדעתי גרם לך לשגיאה בפונקציה שמנסה למלא את המחסנית.2. גם אם האמור בסעיף הקודם מתבצע כהלכה, יש בעיה בקריאה לפונקציה במידה והאלמנט אינו נמצא ברשימה, במקרה כזה תחזיר הפונקציה מצביע לאיבר האחרון, גם אם אין הוא האלמנט הקודם לאלמנט אותו מחפשים. נראה כי בעיה זו לא היוותה במימוש שלך בעיה שכן אכן דאגת להפעיל את הפונקציה על אלמנטים הקיימים ברשימה בלבד3. אם אלמנט הוא טיפוס בסיסי ב-C (כמו int, double וכו') ולא טיפוס שאתה יצרת, לא אמורה להיות בעיה בהפעלת האופרטור =! בסוף שורת ה-while, אחרת אין באפשרות התוכנית להשוות בין אלמנטים שונים אלא באמצעות העמסת אופרטורים, מה שלפי דעתי תכונה חסרה ב-C, קיימת באחותה הגדולה C++, מצד שני אם כן הייתה בעייה אז כנראה היית נתקל בה בשלב הקומפילציה.ממבט מהיר בפונקציות שפירטת, נראה כי אכן אתה נכנס עמוק בתוך הרקורסיה ללא הגעה לתנאי עצירה, כאשר התוכנית מפסיקה כנראה בעת תום מילוי מחסנית הקריאות לפונקציה:1. תחילה השימוש בשורה if (!First(P)) בעייתית לדעתי, שכן אולי מבחינת קונטקסט התכוונת "אם לא האיבר הראשון" אך למעשה הבלוק בתוך התנאי יתבצע רק אם האיבר אחרי P הוא NULL (כלומר P מצביע לאחרון ברשימה)2. התנאי עליו דיברתי בסעיף הקודם יתאמת באיטרציה הראשונה, אך הפונקציה FindPrevious לא תשנה את P שכן הוא המצביע לאיבר האחרון, ואז באופן הקריאה לפונקציה אתה קורא לה למעשה עם רשימה בעלת איבר אחד בלבד, ללא אלמנט דמי (אם הבנתי נכון בו השתמשת במימוש הרשימה) כך שהאיבר הבא הוא NULL ולכן לא תהיה כניסה ללולאה הראשית בפונקציה זו, ולכן P יחזור כפי שהיה. מסיבה זו ש-P אינו משתנה אתה למעשה מפעיל רקורסיה על אותם פרמטרים בלי סיכוי שישתנו באיזשהו שלב ולכן "אינסופית".בסיכומו של עיניין אני מקווה שלא ביאסתי אותך יותר מידיי, שכן כמו שאמרת כל זה כנראה בא מאוחר מידיי, אם בכל זאת יש לך אופציה להגשה מאוחרת (בטח עם הורדת נקודות מסוימת) ואתה צריך עזרה בתיקון, דבר איתי.
פורסם 2007 בספטמבר 2718 שנים מחבר תודה רבה על ההסבר המושקעלפי מה שאני מבין, אופן השימוש בפונצקיה findprevious הוא להעביר לה את האלמנט הראשון ואת הצומת האחרונהובשביל לעשות זאת אני צריך לשמור במשתנה את הערך של האלמנט הראשון בשביל להשתמש בו בהמשך.הבנתי נכון?
פורסם 2007 בספטמבר 2718 שנים אתה צריך לתת לה את האיבר הראשון ואת האיבר שאתה צריך למצוא לו את הקודם.וכן, אתה צריך למצוא דרך לשמור את האיבר הראשון בצורה כלשהי.שים לב, שכדי לפתור את כל השאלה(המיון + ההעברה למחסנית) לא צריך להשתמש בכלל בפונקציה הזו(וגם לא בSETP).
פורסם 2007 בספטמבר 2818 שנים תנסה לחשוב על סדר הפקודות של הקריאה לפונקציה וההוספה למחסנית.תצייר לך בכלליות 2 ציורים - באחד מהם תתאר את מה שקורה כאשר אתה מכניס אחרי הקריאה, ובציור השני תתאר את מה שקורה כאשר אתה מכניס למחסנית לפני הקריאה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.