עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

שפת 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];

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

פורסם

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

פורסם
  • מחבר

תודה לך!

אתה איש טוב :)

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.