פורסם 2007 בנובמבר 2418 שנים יש לי מחלקה 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); } } תודה לעוזרים
פורסם 2007 בנובמבר 2418 שנים אתה צריך לעשות הפרדה בין מערכים שמוקצים באופן סטטי לבין מערכים שמוקצים באופן דינמי.באופן כללי, מערך סטטי הוא מערך שהאורך שלו קבוע וידוע בזמן הקימפול (נתון בקוד), מערך "רגיל". אתה חייב לציין את אורך המערך (אם זה מערך רב מימדי אז את האורך של כל מימד בקוד):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;
פורסם 2007 בנובמבר 2418 שנים מחבר תודהרשמתי את שורות הקוד בקונסטרקטור של המחלקה def , בשלב הלולאה FOR הקומפיילר רושם שגיאה:"Functions containing for are not expanded inline"
פורסם 2007 בנובמבר 2418 שנים יעזור אם תצרף את הקוד המלא. באיזה קומפיילר אתה משתמש? אתה בטוח שזו שגיאה ולא אזהרה?
פורסם 2007 בנובמבר 2418 שנים מחבר אכן זו אזהרה, אבל למה?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; }};
פורסם 2007 בנובמבר 2418 שנים עבור פונקציות שמוגדרות בתוך ההגדרה של המחלקה בקובץ 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;}
פורסם 2007 בנובמבר 2418 שנים מחבר תודה על ההסברים אני חושב שיש לי בעייה בקומפיילר , אפילו תוכנית לדוגמא לא עובדת. אני רוצה להישתמש בפונקציות של graphics.h [attachment deleted by admin]
פורסם 2007 בנובמבר 2418 שנים אתה צריך לקשר את התכנית שלך לחבילת הגרפיקה.עקוב אחרי ההוראות כאן:http://www.onecore.net/turbo-c-graphics-programming.htm(תחת ה-Note, סעיף 2)
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.