שאלה לתותחים בלבד.

yair24

Member
שאלה לתותחים בלבד.

שלום, יש לי שאלה בקשר לפוינטרים. נגיד שיש לי בMAIN מספר מופעים של מחלקה מסוימת. וחיברתי אותם כרשימה מקושרת ציקלית.
screen a,b,c,d,e,f,g; a.next=&b; b.next=&c; c.next=&d; d.next=&e; e.next=&f; f.next=&a;​
בנוסף, יש לי פוינטר אחד מסוג המחלקה הזאת ואני נותן לו את ה& של ראש הרשימה. לפוינטר הזה קוראים head. עכשיו בMAIN יש לי פונקציה שמקבלת כפרמטר פוינטר לרשימה ומה שהיא צריכה לעשות זה לעבור לאיבר הבא. לפונקציה הזאת קוראים:
void GotoNextScreen(screen *p)​
איך אני כותב את הפונקציה הזאת? יאיר
 

yair24

Member
תיקונים

בטלו את המשתנה g הפונקציה היא לא בMAIN אלא יש לה קריאה בMAIN עם HEAD כפרמטר. יאיר
 

jgut

New member
מה זאת אומרת לעבור?

להחזיר פוינטר לאיבר הבא? או להזיז את ה-head?
 

yair24

Member
עוד הבהרה

כמובן שהפונקציה צריכה להעביר את האיבר לאיבר הבא וההשפעה שלה צריכה להיות על הMAIN כלומר אם קראתי לפונקציה פעם אחת אז אחרי הקריאה המשתנה HEAD מצביע כבר על האיבר הבא (לא רק בתוך הפונקציה אלא גם בMAIN) יאיר
 

jgut

New member
האים לזה התכוונת?

void GotoNextScreen(screen *p) { head = head.next; }​
כאשר head הוא גלובלי.
 

yair24

Member
לא

head הוא לא גלובאלי והוא נשלח כפרמטר:
GotoNextScreen(head);​
יאיר
 

jgut

New member
אים כך

תגדיר את הפונקציה כך:
void GotoNextScreen(screen **p) { *p = *p.next; }​
 

yair24

Member
רגע רגע ...

אני עשיתי ככה:
void GotoNextScreen(screen *p) { *p=*p->next; }​
זה עבד. עכשיו את בטח שואלת "אז למה בכלל שאלת אם אתה יודע את התשובה?" התשובה היא: כי היו לי בעיות נוספות עם הדבר הזה היתה לי קריאה לעוד פונקציה בתוך הפונקציה הזאת ושם דברים לא עבדו לי טוב. אם את יכולה להסביר לי בבקשה איך אני קורא לפונקציה עם HEAD כאשר HEAD מוגדר כSCREEN* והפונקציה מקבלת כפרמטר SCREEN**? יאיר
 

jgut

New member
תקרא לה כך

GotoNextScreen(&HEAD) ;​
ואז אתה נותן לה **SCREAN במה שעשית בדוגמא אתה משנה את מה שמוצבע ע"י HEAD ולא את HEAD עצמו
 

jgut

New member
אני חושבת שמשהו כזה

אים הקוד הוא כזה:
void GotoNextScreen(screen *p) { *p=*p->next; } ... screen a,b,c,d,e,f,g; a.next=&b; b.next=&c; ... HEAD = &a; GotoNextScreen(HEAD);​
המשמעות ב - *p=*p->next; היא עושה אותה פעולה כמו a= a.next כי במקרה זה *p הוא בעצם a. אם a היה פוינטר הוא היה מצביע על b
 

yair24

Member
מעניין... יכול להיות שפתרת לי בעיה.

אני אבדוק את מה שאמרת ונראה... יאיר
 

yair24

Member
איזה בעסה...

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