שגיאה בפעולה בשניתי בc# - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


lesForce

Recommended Posts

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

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

קישור לתוכן
שתף באתרים אחרים

  • תגובות 30
  • נוצר
  • תגובה אחרונה

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

נכון, הערך של 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]

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...