עבור לתוכן

שגיאה בפעולה בשניתי בc#

Featured Replies

פורסם

ציינתי זה יוצר deep copy, שבהכרח משכפל את איברי התור.. ( בקריאה חוזרת, זה לא מה שהוא רצה ).

off topic, למה לא הייתה ממליץ על זה? ( במצב שבו באמת דרוש העתק של האובייקט, ושל כל האיברים הפנימיים).

  • תגובות 30
  • צפיות 3.2k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

אז הברירה היחידה היא לעשות remove ואז לעשות insert לערך בכל פעם לשתי תורים חדשים...?

פורסם

אם אתה רוצה לשכפל את התור, אז כן.

אבל תנסה לחשוב על פתרון שלא ידרוש לשכפל את התור (הפתרון כן יצטרך תור עזר).

off topic, למה לא הייתה ממליץ על זה? ( במצב שבו באמת דרוש העתק של האובייקט, ושל כל האיברים הפנימיים).

כי זה כמו לנסוע לחיפה דרך אילת. אם כבר יש לך פונקציית סריאליזציה, אז מילא. אבל אם לא, אז פשוט באותה מידה לממש פונקציית Clone, שעושה בדיוק מה שצריך.

פורסם

חיפה-אילת, אולי. אתה יכל לכתוב Clone לכל מחלקה ומחלקה, אבל כאשר ההירכייה שלך גדלה, זה כבר נהייה מעיק.

השיטה הזו יוצרת deep copy בצורה ג'אנרית לכל אובייקט Serializable .

פורסם
  • מחבר

אתה יכול להראות לי איך תעשה את הפעולה הנ"ל עם תור עזר?

פורסם

קח את התור שלך, ותספור את האיברים שבו בדיוק כמו שאתה עושה עכשיו עם qt2.

ההבדל הוא שכשאתה מוציא איבר מהתור, במקום לזרוק אותו, תכניס אותו לתור העזר.

בסוף הלולאה, התור שלך יהיה ריק, ותור העזר יכיל את כל האיברים באותו הסדר.

פורסם
  • מחבר

אה ואז אני פשוט יוכל להפנות את התור המקורי (qt) לתור העזר (qt2) בסוף הפעולה.

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

פורסם

אה ואז אני פשוט יוכל להפנות את התור המקורי (qt) לתור העזר (qt2) בסוף הפעולה.

לא יעבוד, כי זה ישנה רק את הערך של הפרמטר qt1. מי שקרא לפונקציה Size עדיין יישאר עם תור ריק ביד.

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

קרא את ההודעות הקודמות שלי (בסוף העמוד הראשון).

פורסם
  • מחבר

לא יעבוד, כי זה ישנה רק את הערך של הפרמטר qt1. מי שקרא לפונקציה Size עדיין יישאר עם תור ריק ביד.

למה זה לא יעבוד? אם בסוף הפונקציה אני עושה

qt1=qt2 ?

קרא את ההודעות הקודמות שלי (בסוף העמוד הראשון).

לא רשמת בהודעה הקודמת בדיוק איפה ראית שאין בנאי.

נתת את האתר הזה:http://sites.huji.ac.il/science/unit4_2007/Csharp/Unit4/Unit4Guide.htm

אבל איפה זה אמור להיות רשום שם?

פורסם

תחשוב על הקוד הזה:

void add2(int x) {
x += 2;
}

ואז קריאה לפונקציה, ככה:

int y = 10;
add2(y);

מה יהיה הערך של y?

ולגבי התיעוד, מאיפה יש לך את החבילה הזו, Unit4?

פורסם
  • מחבר

הערך של y ישאר 10?

והחבילה Unit4 היא מהספר לימוד שממנו אני לומד

פורסם

נכון, הערך של y יישאר 10.

אז באותו אופן, אם הפונקציה היא כזו:

void f(Queue q) {
q.remove();
q = new Queue();
}

ואז עושים דבר כזה:

Queue q2 = new Queue();
// add some elements to q2
f(q2);

מה קורה כאן? הפונקציה f מקבלת תור (ליתר דיוק, היא מקבלת מצביע לתור, כי כל הטיפוסים ב-#C, למעט הפרימיטיביים הם מצביעים). היא מוחקת ממנו איבר, ואז משנה את המצביע q כך שיצביע לתור חדש שהיא יוצרת. הקריאה ל-f מעבירה את מצביע לתור q2 לפונקציה, לכן הפונקציה מורידה איבר מהתור הזה, וזהו - q2 נשאר q2, ולא מצביע לתור החדש.

לגבי Unit4 - איזה ספר זה? מאיפה החבילה עצמה? (דיסק שמצורף לספר?) אין שם תיעוד של החבילה?

פורסם
  • מחבר

אז לפי מה שאתה אומר דרך פעולה אני לא יכול לשנות את המצביע של מה ששלחתי לה?

כיאלו אם אני עושה אני מזמן את הפונקציה:

f (q1)

void f (queue q1)
q1=q2

אז q1 יצביע לq2 אבל בסיום הפעולה הוא בעצם לא יצביע לq2? ???

וה-Unit4 הוא מהספר לימוד "עיצוב תוכנה מבוסס עצמים בשפת סישרפ", את החבילה עצמה הם אמרו להוריד מהאתר שלהם (שכבר מצאת אותו לפני כן).

יש שם תיעוד, העלתי תמונה שלו. הם לא אומרים כלום בנוגע לבונה וכל זה...

[attachment deleted by admin]

פורסם

אז לפי מה שאתה אומר דרך פעולה אני לא יכול לשנות את המצביע של מה ששלחתי לה?

בדיוק.

שים לב שבדוגמה שאתה רשמת, יש שני מצביעים שנקראים q1. הראשון הוא הפרמטר שאתה מעביר לפונקציה, כשאתה עושה (f(q1. המצביע הזה מועתק למצביע נוסף, שגם נקרא q1, בתוך הפונקציה f. כל שינוי שאתה עושה למצביע q1 שבתוך f ישנה רק את המצביע הזה, ולא את ה-q1 שמחוץ לפונקציה.

ולגבי התיעוד, מה לדעתך אומרת הפונקציה הראשונה שכתובה שם?

פורסם
  • מחבר

זה לא מסתדר לי כ"כ בראש...

אם אני קורא לפונקציה

f (qt1)

אז לqt1 יש מצביע אחד כבר , וכאשר אני מזמן את הפעולה הזו נוצר עוד מצביע שמצביע לqt1. ולכן כל פעולה שאני מבצע בפונקציה תשפיע על qt1 כי היא מצביעה אליו. זה מה שהבנתי עד עכשיו... אבל לפי מה שאתה אומר זה לא ככה, לא? לפי מה שהבנתי ממך זה שאם אני מבצע כל מיני פעולות על qt1 בפונקציהת בסיום הפונקציה הוא לא ישתנה? :s05: :s05:

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


Stack<string> st2 = new Stack<string>(s);

ואם זיכורני אינו מטעה אותי זה עבד יופי..

[attachment deleted by admin]

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים