עבור לתוכן

בעיה בהכנסת איברים לווקטור ב C++

Featured Replies

פורסם

הסיפור קצת מורכב, אני אנסה לפשט.

קיימת אצלי מחלקה מסוימת שמוגדרים בה אופרטורים פשוטים כדוגמת =,+,*, *=,+= וכד'.

המחלקה בפני עצמה עובדת היטב, בדקתי.

כעת אני מייצר אובייקט כלשהוא שבתוכו מחזיק ווקטור מסוג הקלאס שהציינתי, נאמר ושמו a, כלומר


vector<a> matrix

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

אני מעוניין לבצע שחלוף שלה, ולכן כתבתי את המתודה transpose.

השיטה המשחלפת מחזירה מטריצה חדשה.

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

קיימות שתי שיטות שימושיות לקטע הזה:


void GetCol(vector<a> &vec, int colNum);

ובאופן דומה לקבלת וקטור השורה ה- i, שתיהן מקבלות רפרנס לווקטור ומעתיקות לתוכו את התוכן.

השיטה transpose:


MyMatrix MyMatrix::Transpose() const
{
MyMatrix res(_numCol,_numRow);
for (int i = 0; i < _numCol; ++i)
{
vector<a> v;
GetCol(v,i);
res.InsertRow(v,i);
}

return res;

}

כאשר המתודה inserRow:
[code]
void MyMatrix::InsertRow(vector<a> &row, int n)
{
for (int i = 0, startLoc = n* _numCol; startLoc < n*_numCol + _numCol; ++i,++startLoc)
_matrix[startLoc] = row[i];
}

אני מסתובב סביב עצמי כבר לא יודע כמה זמן וזה כל הזמן מחזיר לי seg-fault.

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

החלק שגורם לי seg-fault הוא כתיבת השורה.

אשמח לעזרה,

תודה

פורסם

אני מניח ש-matrix_ הוא גם כן וקטור? אם כן, אז תחליף את כל הגישות לוקטורים מ-[] לפונקציה at. הפונקציה הזו זורקת שגיאת out_of_range במקרה של חריגה, ותוכל לתפוס אותה באמצעות הדיבאגר ולראות בדיוק איפה הבעיה. אחרי שתטפל בבעיה תוכל להחזיר ל-[].

חוץ מזה, אני מניח ש-matrix_ מאותחל כראוי?

פורסם
  • מחבר

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

בפועל, (וכן, מטריצה הוא מסוג וקטור) באובייקט אני מצהיר על

vector<a> _matrix;

וזהו.

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

הרי ההצהרה על השורה עצמה משתמשת בקונסטרקטור הדיפולטיבי, נכון?

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

הכנסה לאינדקס מסוים אינה נעשית באופן שקוף מבחינתי, ביחד לוקטור?

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

פורסם

באופן שאתחלת את הוקטור, הוא ריק - הגודל שלו הוא 0.

push_back מכניס איברים לסוף הוקטור ומגדיל אותו, ככה שהוא תמיד עובד. אבל גישה באמצעות [] רק דורכת על מקומות קיימים. אם הוקטור בגודל 2 ותנסה לגשת ככה למקום 3, תהיה לך שגיאה.

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

http://www.cplusplus.com/reference/stl/vector

ארכיון

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

דיונים חדשים