פורסם 2010 בינואר 1515 שנים שלום!הפונקציה הבאה:אמורה להעתיק את המצביעים למבנים במטריצה שהוקצאה קודם ונשלחה לפונקציה //A function to fill the city with the person pointers in the following order://Each col is for a different street and in the col the person pointers are inserted //in the order of their house number. 0 should be the value of empty elements.void FillMatrix(const Person *CityPersonArr[],Person *personArr[],int persons_count,int cols,int rows)לא מחזירה כלום. כאשר:Person - הוא טיפוס מסוג מבנה[] Person *personArr - מערך מצביעים למבנה מסוג Person שמגיע לפונקציה כשהוא ממויין בסדר עולה לפי שם הרחובint persons_count - מספר האנשים הכולל ( מספר האיברים במערך המצביעים למבנים [] PersonArr*)row - מייצג את מספר שורות המטריצה(המפספר שיגיע ייקבע על פי המספר המקסימלי של אנשים הגרים באותו רחוב)col - מייצג את מספר העמודות במטריצה(המספר שיגיע ייקבע על פי מספר הרחובות השונים הקיימים) מצורף קטע בקוד הבא:void FillMatrix(const Person *CityPersonArr[],Person *personArr[],int persons_count,int cols,int rows){ int i; rows=0; cols=0; CityPersonArr[0][0] = personArr[0];//error l-value specifies const object //error '=' incompatible types for(i=0;i<persons_count-1;i++) { if(strcmp(personArr[i]->address.pStreetName,personArr[i+1]->address.pStreetName)) rows++; else { rows=0; cols++; } CityPersonArr[rows][cols] = personArr[i+1];//error l-value specifies const object //error '=' incompatible types }}תודה על העזרה!
פורסם 2010 בינואר 1515 שנים מחבר CityPersonArr - מטריצת מצביעים למבנה Person סתם לידע הכללי כך נראה המבנה:typedef struct{ unsigned house_number; char* pStreetName;}Address;typedef struct{ Address address; char name[LEN];} Person;ועוד משהו - אני יודע שבשורה של ההצבה שבה אני מקבל שגיאה, שאני בעצם מנסה להציב כתובת בתוך תא במטריצהCityPersonArr שהתאים בה הוא מטיפוס שונה - מבנה ולא מצביע למבנה.אך ניסיתי כל מה שעלה במוחי וללא הועיל.אשמח לקבל פתרון לבעיה.אגב שורת ההגדרת של הפונקציה נתונה - כך שלא ניתן לשנותה.
פורסם 2010 בינואר 1515 שנים הממ.... איך CityPersonArr היא מטריצה דו מימדית? היא רק מערך חד-מימדי של מצביעים, ולא מערך דו-מימדי של מצביעים, או מערך של מערכים של מצביעים.הקוד לא מתקמפל כי אתה ניגש ל-CityPersonArr כאילו היא כן הייתה מערך דו מימדי. הביטוי הזה:CityPersonArr[0]הוא האיבר הראשון ב-CityPersonArr, והטיפוס שלו הוא *const Person. לכן, הביטוי הזה:CityPersonArr[0][0]שקול לזה:*(CityPersonArr[0])והטיפוס שלו הוא const Person, כלומר אי אפשר לשים לתוכו שום דבר, ולכן הביטוי הזה:CityPersonArr[0][0] = blablablaלא מתקמפל.חוץ מזה, לא הבנתי - למה משמשים הפרמטרים rows/cols? למה אתה דורך עליהם ברגע שאתה מקבל אותם?
פורסם 2010 בינואר 1515 שנים מחבר האמת שאני חושב על זה, אני באמת מאפס את rows ו cols - ואני כנראה לא אמור לעשות את זה, כי הם מגיעים עם ערכים שאמורים לעזור לי איכשהו בהשמת המצבעים למבנים בתוך המטריצה([]CityPersonArr*)...דבר נוסף - [] const Person *CityPersonAr :מערך מצביעים למבנה קבוע - נאמר לי שלמרות שהוא מוגדרכ const אפשר להציב בתוכו מצביעים למבנה...אבל לפי מה שאני מבין תאי המטריצה מכילים מבנים.אז איך אני אמור להציב בתאים האלו מצביעים למבנים???אני ממש מבולבל - בבקשה SOS!!!
פורסם 2010 בינואר 1515 שנים למיטב הבנתי, ה-rows/cols נותנים לך את המימדים של המטריצה, כשהמטריצה נתונה לך באופן פרוש (כלומר כמערך חד מימדי). בשביל להתייחס לאיבר ה-i,j במטריצה, צריך לעשות:CityPersonArr[i*rows + j];לגבי ה-const, משתנה מהטיפוס הזה:const Person* p;אומר ש-p הוא מצביע ל-const Person. זה אומר שאפשר לשנות את p, אבל אי אפשר לשנות את המבנה שהוא מצביע אליו. נניח שיש לך משתנה a מטיפוס Person, ואת המצביע p. אז הביטוי הזה תקני:p = &a;כי הוא משנה את המצביע. שני הביטויים האלה לא תקניים:*p = a;p->address.house_number = 1;כי הם משנים את המבנה שעליו p מצביע. יש מבין?כשיש לך דבר כזה:const Person* CityPersonArr[]אז זה מערך של מצביעים. כל איבר במערך הוא מצביע, שאפשר לשנות אותו. אבל כל מצביע כזה הוא מצביע למבנה כלשהו, שאותו אי אפשר לשנות.
פורסם 2010 בינואר 1515 שנים מחבר אני אנסה ליישם את הדברים שכתבת,אם אני עדיין אתקע - יהייה המשך,בכל מקרה נקווה שלא...בינתיים תודה רבה שניצלון!
פורסם 2010 בינואר 1615 שנים void FillMatrix(const Person* CityPersonArr[],Person* personArr[],int persons_count,int cols,int rows) { int i = 0, k; cols = 0; for (k=0;k < persons_count-1; k++) { CityPersonArr[i*rows+cols] = personArr[k]; if (strcmp(personArr[k]->address.pStreetName,personArr[k+1]->address.pStreetName) == 0 ) { i++; } else { cols++; i = 0; } } CityPersonArr[i*rows+cols] = personArr[k];}* שים לב שיש פה טעות, הדוגמא הזו עובדת תקין רק על מטריצה ריבועית. תשנה את הקוד כך שהוא יקפוץ שורה לפי מספר העמודות ולא השורות.
פורסם 2010 בינואר 1615 שנים מחבר זה בדיוק מה שעשעיתי - חוץ מהשורה האחרונה:CityPersonArr[i*rows+cols] = personArr[k];למה היא נחוצה?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.