פורסם 2011 באוקטובר 1314 שנים שלום,נניח ואני צריך לעשות רשימה של מכוניות, זה המבנה שלהן: typedef struct{ int num; char name[50]; list owner}CARאז עפ"י מה שלמדנו, אני ניגש לקובץ של ה list.h ופשוט מגדיר שם איזשהו elementType שיוכל לטפל במבנה הזה (של המכונית)עכשיו מה קורה עם הרשימה של הבעלים (list owner) שצריכה להיות בתוך כל איבר כזה, ומן הסתם צריכה לטפל במבנה אחר? אני אמור להגדיר 2 קבצי list.h ? או להפוך עכשיו כל פונקציה בlist להיות גנרית? בגדול השאלה היא איך להגדיר רשימה בתוך רשימה כאשר הן שונות אחת מהשנייה מבחינת הטיפוס\מבנה של כל איבר, קצת הסתבכתי עם זה ואני מקווה גם שהבנתם מה הבעיה, אם לא אשמח לפרט יותר, תודה.
פורסם 2011 באוקטובר 1314 שנים דרך אחת היא פשוט להגדיר שני טיפוסים לא קשורים של רשימות - "רשימת מכוניות" ו"רשימת אנשים". זה כמובן לא יעבוד במקרה הכללי (מה אם תרצה בעתיד לעשות עוד סוגים של רשימות?)הדרך לעשות דברים "גנריים" ב-C היא פשוט באמצעות מצביעים ו-*void.להזכירך, ברשימה מקושרת משתמשים במבנה בסיסי שנקרא Node, המכיל שני שדות - data (המידע שמכיל ה-Node, שהוא מהטיפוס שאתה רוצה שהרשימה תכיל, כמו "מכונית" או "איש") ו-next (המצביע ל-Node הבא). על מנת לעשות את הרשימה גנרית, אתה יכול לעשות שה-data יהיה מטיפוס *void, דהיינו "מצביע כללי", ללא טיפוס ספציפי. ככה אתה יכול ליצור שתי רשימות (ויותר), כשלאחת אתה תמיד דואג להכניס איברים מסוג "מכונית" ולאחרת אתה תמיד דואג להכניס איברים מסוג "איש". כמובן, כשאתה ניגש לשלוף איברים מתוך הרשימות הללו, הקומפיילר לא יודע מה הטיפוסים המקוריים שהכנסת פנימה - הוא רואה רק מצביעים. אתה צריך להמיר את המצביעים הללו חזרה לטיפוסים שהכנסת במקור. זוהי בעצם אחריותך להיות עקבי ולזכור בדיוק מה הטיפוסים שישבו בתוך הרשימה (כלומר, שלא תנסה בטעות לגשת לרשימה של האנשים ולהתייחס לאיברה כאל מכוניות).
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.