עבור לתוכן

בעיה ברשימות ב c++

Featured Replies

פורסם

void removetempcard(int i,int j)
{
posIter=posl.begin();
tempIter=templcard.begin();
while(tempIter!=templcard.end())
{
if((posIter->x==i)&&(posIter->y==j))
{
posl.erase(posIter);
templcard.erase(tempIter);
}
posIter++;
tempIter++;
}
}

זה הקוד הבעייתי.

קצת הסברים ורקע :

templcard זה רשימה שאמורה לשמור קלפים מסויימים

posl זה רשימה שאמורה לשמור את המיקומים של אותם קלפים

הם עובדים בתאום, נגיד האיבר הראשון ב templcard המיקום שלו יהיה באיבר הראשון ב posl

ולכן אורכם שווה.

בפונ' הזאת אני מקבל 2 אינדקסים i ו j אם האינדקסים האלה קיימים ברשימה posl

אני רוצה להסיר את הקלף הזה וגם את המיקום שלו.

יש לי שגיאת זכרון בעת הרצה :

Unhandled exception at 0x00421add in rum.exe: 0xC0000005: Access violation reading location 0xfeeefef6.

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

המעבר הראשון עובר בסדר גומר והקלף שצריך להוריד אותו אכן יורד

מישהו לעזור לי לפתור את הבעיה?

פורסם

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

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

- למה לא לעשות רשימה של pair? נראה לי הרבה יותר מתאים למקרה הזה

פורסם
  • מחבר

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

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

- למה לא לעשות רשימה של pair? נראה לי הרבה יותר מתאים למקרה הזה

ניסיתי לעשות את מה שאמרת

הפונ' המתוקנת :

void removetempcard(int i,int j)
{
list<pos>::iterator posIter2;
list<card>::iterator tempIter2;

posIter=posl.begin();
tempIter=templcard.begin();
while(tempIter!=templcard.end())
{
if((posIter->x==i)&&(posIter->y==j))
{
posIter2=posIter;
tempIter2=tempIter;
posl.erase(posIter2);
templcard.erase(tempIter2);
}
posIter++;
tempIter++;
}
}

הארור שאני מקבל בזמן שהיא צריכה לרוץ:

rum.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

מבדיקה שלי שוב פעם הארור נוצר בכניסה השניה ל while

באותה שורה (התנאי)

פורסם

אמרתי קודם לקדם ואז למחוק. אתה קודם מחקת ואז קידמת, בעצם לא שינית כלום.

פורסם
  • מחבר

אמרתי קודם לקדם ואז למחוק. אתה קודם מחקת ואז קידמת, בעצם לא שינית כלום.

תודה רבה זה אכן עובד

עכשיו אני יצטרך לתקן קצת דברים אחרים

ארכיון

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

דיונים חדשים