עבור לתוכן

שפת C - בעיה בהצבת מצביעים במטריצת מצביעים

Featured Replies

פורסם

שלום!

הפונקציה הבאה:

אמורה להעתיק את המצביעים למבנים במטריצה שהוקצאה קודם ונשלחה לפונקציה

//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
}
}

תודה על העזרה!

פורסם
  • מחבר

CityPersonArr - מטריצת מצביעים למבנה Person

סתם לידע הכללי כך נראה המבנה:

typedef struct
{
unsigned house_number;
char* pStreetName;

}Address;

typedef struct
{
Address address;
char name[LEN];
} Person;

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

CityPersonArr שהתאים בה הוא מטיפוס שונה - מבנה ולא מצביע למבנה.

אך ניסיתי כל מה שעלה במוחי וללא הועיל.

אשמח לקבל פתרון לבעיה.

אגב שורת ההגדרת של הפונקציה נתונה - כך שלא ניתן לשנותה.

פורסם

הממ.... איך CityPersonArr היא מטריצה דו מימדית? היא רק מערך חד-מימדי של מצביעים, ולא מערך דו-מימדי של מצביעים, או מערך של מערכים של מצביעים.

הקוד לא מתקמפל כי אתה ניגש ל-CityPersonArr כאילו היא כן הייתה מערך דו מימדי. הביטוי הזה:

CityPersonArr[0]

הוא האיבר הראשון ב-CityPersonArr, והטיפוס שלו הוא *const Person. לכן, הביטוי הזה:

CityPersonArr[0][0]

שקול לזה:

*(CityPersonArr[0])

והטיפוס שלו הוא const Person, כלומר אי אפשר לשים לתוכו שום דבר, ולכן הביטוי הזה:

CityPersonArr[0][0] = blablabla

לא מתקמפל.

חוץ מזה, לא הבנתי - למה משמשים הפרמטרים rows/cols? למה אתה דורך עליהם ברגע שאתה מקבל אותם?

פורסם
  • מחבר

האמת שאני חושב על זה, אני באמת מאפס את rows ו cols - ואני כנראה לא אמור לעשות את זה,

כי הם מגיעים עם ערכים שאמורים לעזור לי איכשהו בהשמת המצבעים למבנים בתוך המטריצה([]CityPersonArr*)...

דבר נוסף - [] const Person *CityPersonAr :מערך מצביעים למבנה קבוע - נאמר לי שלמרות שהוא מוגדר

כ const אפשר להציב בתוכו מצביעים למבנה...אבל לפי מה שאני מבין תאי המטריצה מכילים מבנים.

אז איך אני אמור להציב בתאים האלו מצביעים למבנים???

אני ממש מבולבל - בבקשה SOS!!!

פורסם

למיטב הבנתי, ה-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[]

אז זה מערך של מצביעים. כל איבר במערך הוא מצביע, שאפשר לשנות אותו. אבל כל מצביע כזה הוא מצביע למבנה כלשהו, שאותו אי אפשר לשנות.

פורסם
  • מחבר

אני אנסה ליישם את הדברים שכתבת,

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

בינתיים תודה רבה שניצלון!

פורסם

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];
}

* שים לב שיש פה טעות, הדוגמא הזו עובדת תקין רק על מטריצה ריבועית.

תשנה את הקוד כך שהוא יקפוץ שורה לפי מספר העמודות ולא השורות.

פורסם
  • מחבר

זה בדיוק מה שעשעיתי - חוץ מהשורה האחרונה:

CityPersonArr[i*rows+cols] = personArr[k];

למה היא נחוצה?

פורסם

אם זה לא יהיה שם האחרון שצריך להכניס למטריצה יתפספס

פורסם
  • מחבר

תודה לך!

אתה איש טוב :)

ארכיון

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

דיונים חדשים