מעט מתמטיקה

itaym02

New member
שאלת swap

ברצוני לכתוב פונקציה שתחליף בין Instance של שני אובייקטים. הבעייה שאובייקט אחד למעשה יורש מהאובייקט השני. בקוד זה ברור יותר, וזה לא עובד.
public class Item { } public class BigItem :Item { } swapFunction (ref Item A, ref Item B) { Item C; C=A; A=B; B=C; } Main() { Item First=new BigItem(); //Notice I use the parent Item to define BigItem Second=new BigItem(); swapFunction (ref First,ref Second); }​
 
../images/Emo124.gifלא רואה בעיה מיוחדת בהחלפה

לא ברור לי בשביל מה, אבל עם ה Casting הנכון, ההחלפה עובדת :
namespace ConsoleApplication2 { class Item { } class BigItem : Item { } class Class1 { static void Main(string[] args) { Item item = new BigItem(); BigItem bigItem = new BigItem(); Item tmp = new BigItem(); tmp = item; item = bigItem; bigItem = (BigItem)tmp; } } }​
 

itaym02

New member
אאהה - לא

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

itaym02

New member
../images/Emo105.gifמישהוא יודע על דרך נוספת?

הייתי מעדיף לא להשתמש בפתרון שכבר הוצע פה.
 

itaym02

New member
לא יכול

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

;()Item First=new BigItem שאלה- תגיד הוא לא זורק לך פה שגיאה?
 
עוד תוספת\הבהרה

לפי מה שהבנתי אתה רוצה להחליף את הitems של הbigitem. במצב הנוכחי שהצגת נראה לי שהוא יזרוק לך הרבה שגיאות casting בקריאה לפונקצייה לדעתי אתה צריך לקרוא לה בצורה הבאה: ;(swapFunction (ref (Item)First,ref (Item)Second
 
בעצם התוספת זו נראת לי יותר הגיונית

הראשון אני כמעט בטוח שזה טעות. בקריאה לפונקצייה לדעתי אתה צריך לקרוא לה בצורה הבאה: ;(swapFunction(ref First.Item,ref Second.Item עכשיו הref מתייחס לitem
 

itaym02

New member
אז כך:

הBigItem הוא בן של Item מכאן שזה חוקי (קוד שכבר עובד, כן?): Item I=new BigItem אי אפשר לעשות casting בדרך שהצעת בקריאה לפונקציה שהערכים שלה הם ref.
 

itaym02

New member
אבל זה לא מצליח

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

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

itaym02

New member
../images/Emo4.gif

היא לא יכולה לטפל בכל האובייקטים שיורשים מItem, ויש הרבה כאלו.
 

gilad g

New member
זו בדיוק הנקודה,

היא לא צריכה לטפל בכולם
אתה פשוט קורא לה ככה:
Item1 i1 = new Item1(); Item2 i2 = new Item2(); ii1 = (Item)i1; ii2 = (Item)i2; Swap(ref ii1, ref ii2);​
קצת מלוכלך, אבל אין מה לעשות... כנראה שב-ref-ים אין התייחסות להורשה - קומפיילר מפגר
 

itaym02

New member
נו טוף

מזה ניסיתי להמנע - הרי SWAP קלאסי זה רק שלוש שורות. וזה יוצא לפחות 4 עם הקריאה לפונקציה עצמה.
 

itaym02

New member
מעט מתמטיקה

הינה הבעיה: 1. יש מערך דו מימדי 2. יש משתנה שמצביע על המיקום הנוכחי במערך (אם תרצו Point). 3. יש פונקציה שמשנה את מיקום המצביע, כל פעם בצעד אחד (מאוזן או מאונך) 4. הפונקציה יודעת להזיז על פי הקלט שלה, שהוא מחרוזת: למעלה,למטה,שמאלה,ימינה. ניתן לתת לכל קוד כזה ערך מספרי. איך אפשר, במינימום (השאיפה ל2) שאלות לדעת שאני לא חורג מגבולות המערך.
 
אולי התכוונת לזה?

if point.col<colsize-1 and point.col>0 then 'not in the limit of col end if if point.row<rowsize-1 and point.row>0 then 'not in the limit of row end if​
rowsize-שורה ו -עמודהcolsize זה הגודל של המערך הדו מימדי
 

itaym02

New member
לא כל כך פשוט

זה ארבע שאלות. -יתכן שאין תשובה, גם את זה צריך לקחת בחשבון. -הקלט שלי הוא לא נקודה, כאם צעד (למעלה,למטה,ימינה,שמאלה) הכיוון ההתחלתי שלי הוא (ולא בטוח שזה נכון) להתייחס לציר Y כספרת עשרות ולציר X כספרת אחדות. נניח שיש לי מערך Y=4 וX=5 אז הקלט: למעלה 5- למטה 5 שמאלה 1- ימינה 1 ראה דוגמה לתנועה למעלה\למטה: בחר נקודה במערך, לך אחורה 5 צעדים, תגיע לקצה המערך - תעלה למעלה.
0 1 2 3 4 0 1 2 3 4​
אני זוכר משעורי מתמטיקה שאפשר כל גראף בעל N ממדים, להעביר לגרף בעל N-1 ממדים. לכן אני חושב שאפשר לעשות זאת גם כאן.
 
למעלה