עבור לתוכן

עזרה במערך אובייקטים דו מימדי בC++

Featured Replies

פורסם

יש לי מחלקה

class abc

{

public:

int x;

abc()

{

x=0;

}

};

אני רוצה ליצור ממנו מערך דינמי (יקבע בהמשך) לדוגמא:

class def

{

public:

//אני יודע שהשורה הבאה זו טעות, אז איך באמת עושים זאת?

abc aaa[][];

int size;

def(int size)

{

this->size=size;

//אני יודע שהשורה הבאה זו טעות, אז איך באמת עושים זאת?

aaa=new abc;

}

};

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

אני משער:

void print2D_array()

{

int i,j;

for(i=0; i<size; i++)

{

cout<<"\n";

for(j=0; j<size; j++)

cout<<aaa[j].x<<setw(4);

}

}

תודה לעוזרים :)

פורסם

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

באופן כללי, מערך סטטי הוא מערך שהאורך שלו קבוע וידוע בזמן הקימפול (נתון בקוד), מערך "רגיל". אתה חייב לציין את אורך המערך (אם זה מערך רב מימדי אז את האורך של כל מימד בקוד):

abc sarray[10][10]

sarray הוא מערך דו מימדי שמוקצה באופן סטטי בגודל 10x10 ומוכן לשימוש.

במקרה ואורך המערך לא ידוע בזמן הקימפול (אלא בזמן הריצה) צריך להקצות אותו באופן דינמי בעזרת new ולבסוף לשחרר אותו בעזרת delete. את המערך אתה שומר בעזרת מצביע.

מערך דו מימדי שכזה דורש יותר עבודה (כדאי לך אולי לבדוק אלטרנטיבות אחרות כמו שימוש ב vector מה STL למשל). אתה צריך להגדיר מצביע למצביע, להקצות אותו (את המצביע ה"ראשי") ואז להקצות כל שורה בנפרד:

abc** darray = new abc*[rows];
for (int i=0; i<row; i++)
darray[i] = new abc[cols];

כש row הוא משתנה שמחזיק את מס' השורות ו cols את מספר העמודות.

זכרון שהוקצה בעזרת new חייב להשתחרר באופן ידני ע"י קריאה ל delete. לכן, לאחר שסיימת להשתמש בו אתה חייב לשחרר אותו בעזרת []delete: קודם כל כל שורה בנפרד ואז את darray עצמו:

for (int i=0; i<row; i++)
delete[] darray[i];
delete[] darray;

פורסם
  • מחבר

תודה

רשמתי את שורות הקוד בקונסטרקטור של המחלקה def , בשלב הלולאה FOR הקומפיילר רושם שגיאה:

"Functions containing for are not expanded inline"

פורסם

יעזור אם תצרף את הקוד המלא. באיזה קומפיילר אתה משתמש? אתה בטוח שזו שגיאה ולא אזהרה?

פורסם
  • מחבר

אכן זו אזהרה, אבל למה?

class abc

{

public:

int x;

abc()

{

x=0;

}

};

//_________________________________________________________________________

class def

{

public:

abc **aaa;

int size;

def(int size)

{

this->size=size;

aaa=new abc*;

for(int e=0; e<size; e++) //אזהרה

aaa[e]=new abc;

}

};

פורסם

עבור פונקציות שמוגדרות בתוך ההגדרה של המחלקה בקובץ h (מוגדרות "על המקום") הקומפיילר (כברירת מחדל) מנסה ליצור אותן כ inline: בכל מקום שבו יש קריאה לפונקציה מוכנס הקוד המלא של הפונקציה ולא קריאה לפונקציה. יכולים להיות לכך יתרונות מבחינת ביצועים. אתה מוזמן לקרוא יותר לעומק על inline functions כאן:

http://www.parashift.com/c++-faq-lite/inline-functions.html

במקרה הזה, הקומפיילר פשוט מודיע שעקב הלולאה (לולאת ה for) הפונקציה לא תהיה inline. לך זה לא באמת משנה.

באופן כללי, כדי לשמור על הקוד קריא, עדיף להפריד בין ההצהרה על המחלקה (והפונקציות שלה) לבין המימוש (הקוד עצמו). אפשר לממש את הפונקציות בקובץ cpp או במקרה הצורך בקובץ ה h אבל לא בתוך הגדרת המחלקה.

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

~def()
{
for (int i=0; i<row; i++)
delete[] darray[i];
delete[] darray;
}

פורסם
  • מחבר

תודה על ההסברים ;)

אני חושב שיש לי בעייה בקומפיילר , אפילו תוכנית לדוגמא לא עובדת.

אני רוצה להישתמש בפונקציות של graphics.h

[attachment deleted by admin]

פורסם
  • מחבר

וואלה איך שכחתי לקשר :kopfpatsch:

תודה

ארכיון

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

דיונים חדשים