ABA


"עזרה בC++, תצילו אותי מהכאב ראש הזה !!"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #21778 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 21778
xSk8t3r
חבר מתאריך 26.9.09
1173 הודעות
   15:27   21.08.16   
אל הפורום  
  עזרה בC++, תצילו אותי מהכאב ראש הזה !!  
 
   יישמתי את האופרטור = כדי שנוכל להשוות בין 2 אובייקטים, יש למישהו מושג למה זה מפיל לי את התוכנית בשחרור זכרון ?
מחלקת MString :
http://paste.ofcode.org/LGCHWgG5afGsjJ2EkRTykw

מיין
http://paste.ofcode.org/327KHnhbRrBtqCTkLcgZjtn
הדר
http://paste.ofcode.org/cXUXuiqaWF5W585Q5UhMC2

אשמחחח לתשובה למה אני כבר השתגעתי! תודה רבה לעוזרים



                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני מניח שהבעיה זה בקונסטרקטור simond15  21.08.16 16:09 1
     יכול, מה שהוא עושה זה השמה של מצביע למצביע rainmaker 21.08.16 16:14 3
         פשוט שיעשה לזה new אולי לא? eliran005  21.08.16 16:18 4
             תלוי בגרסה rainmaker 21.08.16 16:48 5
  הבעיה באתחול המחרוזת rainmaker 21.08.16 16:12 2
  איך עליתם על זה כלכך מהר? xSk8t3r 21.08.16 17:27 6
     כל מחרוזת שתכניס ככה HARD CODED בגרשיים זה זיכרון שלא אתה יוצר Adielb  21.08.16 17:39 7
         טוב לדעת xSk8t3r 22.08.16 01:34 9
  כמה הערות על הקוד שלך (אם זה מעניין אותך) rainmaker 21.08.16 19:44 8
     מעניין מעניין xSk8t3r 22.08.16 02:00 10
     שימוש ב int rainmaker 22.08.16 09:54 11
     שרשור אופרטורים rainmaker 22.08.16 09:57 12
     הרגלי כתיבה-סוגריים מסולסלים rainmaker 22.08.16 09:59 13
     AddChar(const char* word) rainmaker 22.08.16 10:01 14
     SetString() ו char MString::operator (const int i) rainmaker 22.08.16 10:05 15

       
simond15  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 21.8.10
1144 הודעות, 3 פידבק
   16:09   21.08.16   
אל הפורום  
  1. אני מניח שהבעיה זה בקונסטרקטור  
בתגובה להודעה מספר 0
 
   data = "UNKNOWN";
אתה לא יכול לעשות השמה כזאת לסטרינג(ואני די מופתע שזה עובר קומפילציה בכלל...)
תנסה להשתמש ב strcpy במקום



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   16:14   21.08.16   
אל הפורום  
  3. יכול, מה שהוא עושה זה השמה של מצביע למצביע  
בתגובה להודעה מספר 1
 
   הבעיה אחרי זה היא השחרור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
eliran005  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 6.6.05
32282 הודעות, 6 פידבק
   16:18   21.08.16   
אל הפורום  
  4. פשוט שיעשה לזה new אולי לא?  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   16:48   21.08.16   
אל הפורום  
  5. תלוי בגרסה  
בתגובה להודעה מספר 4
 
  
data = new char { 'U','N','K','N','O','W','N','\0' };

למרות שבכל מקרה זה לא טוב לאתחל את המחרוזת במחרוזת שבאופן עקרוני היא חוקית...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   16:12   21.08.16   
אל הפורום  
  2. הבעיה באתחול המחרוזת  
בתגובה להודעה מספר 0
 
  

data = "UNKNOWN";

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
xSk8t3r
חבר מתאריך 26.9.09
1173 הודעות
   17:27   21.08.16   
אל הפורום  
  6. איך עליתם על זה כלכך מהר?  
בתגובה להודעה מספר 0
 
   בכל מקרה היה אסור לנו להשתמש בספרייה string.h בגלל זה אי אפשר קופי אבל זה סודר ועובד תודה רבה לכם !!!



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Adielb  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 22.6.11
7352 הודעות, 7 פידבק
   17:39   21.08.16   
אל הפורום  
  7. כל מחרוזת שתכניס ככה HARD CODED בגרשיים זה זיכרון שלא אתה יוצר  
בתגובה להודעה מספר 6
 
   אלא הקומפיילר מקצה לה מקום

ואם אסור לכם להשתמש בספריית string, תחפש את ה-terminating null
במחרוזת, ואז תשתמש ב-memcpy עד התו הזה (רק תוודא שהמקום אליו אתה מעתיק מכיל מספיק מקום,
כי אם לא תקבל דריסת זיכרון ב-memcpy)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
xSk8t3r
חבר מתאריך 26.9.09
1173 הודעות
   01:34   22.08.16   
אל הפורום  
  9. טוב לדעת  
בתגובה להודעה מספר 7
 
  



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   19:44   21.08.16   
אל הפורום  
  8. כמה הערות על הקוד שלך (אם זה מעניין אותך)  
בתגובה להודעה מספר 0
 
  
הקטע הבא חוזר הרבה פעמים:
data = new char; //memory allocation
assert(data != 0);//success check
data = '\0';

לא חשוב שאני לא רואה ערך ב ASSERT אבל אתה יכול לעשות מזה פונקציה פרטית
נניח:
InternalCreate

אתה מקבל קלט בתור המימוש של מחלקה שאמורה להיות בלתי תלויה ב רכיב קלט
ה בנאי יחכה לקלט?!

String::MString(int length)
{
this->length = length;
cout << "Please enter the length of the string" << endl;
cin >> length;

this->data = new char;//memory allocation
assert(data != 0);//success check
data = '\0';
for (int i = 0; i < length; i++)
data = 'U';//values input

}


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

cout << "Strings has successfully been coppied" << endl << endl;


עדיף לך לעשות את זה מחוץ למחלקה פשוט אחרי העתקה תשמש באופרטור השוואה שעשית לוודא שהמחרוזות זהות(האמת שזה יותר מתאים ל UNIT TEST אבל אני מניח שביקשו ממכם להדפיס תוצאות)

יש לך שורה כזאת:

this->length = b.length; // setting similar size

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

את הפונקציה הבאה אפשר לכתוב יותר יפה בעזרת אופרטור מצביע


int MString::Strlen(){
int i = 0;
while (data != '\0')
i++;
return i;
}

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
xSk8t3r
חבר מתאריך 26.9.09
1173 הודעות
   02:00   22.08.16   
אל הפורום  
  10. מעניין מעניין  
בתגובה להודעה מספר 8
 
   לקחתי לתשומת ליבי תודה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   09:54   22.08.16   
אל הפורום  
  11. שימוש ב int  
בתגובה להודעה מספר 8
 
  
אם אתה לא משתמש במספר שלילי לסמן מחרוזת לא מאותחלת אז עדיף להשתמש ב סוג שיכול לייצג רק מספרים חיובים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   09:57   22.08.16   
אל הפורום  
  12. שרשור אופרטורים  
בתגובה להודעה מספר 8
 
  

האם אני יכול לחבר 3 מחרוזות.....?

s1+s2+s3


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   09:59   22.08.16   
אל הפורום  
  13. הרגלי כתיבה-סוגריים מסולסלים  
בתגובה להודעה מספר 8
 
  
for (int j = 0; j < length; j++)
data = str;


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


למה אתה משתמש במשתנה this בתוך הפונקציות?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   10:01   22.08.16   
אל הפורום  
  14. AddChar(const char* word)  
בתגובה להודעה מספר 8
 
  

המימוש שלה קצת מסובך לפי טעמי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
rainmaker
חבר מתאריך 21.8.16
10 הודעות
   10:05   22.08.16   
אל הפורום  
  15. SetString() ו char MString::operator (const int i)  
בתגובה להודעה מספר 8
 
   ערכתי לאחרונה בתאריך 22.08.16 בשעה 10:08 בברכה, rainmaker
 
SetString

אני כבר לא זוכר אבל נדמה לי שאפשר לעשות overload ל CIN
כך שיקבל מחרוזת ואז הפונקצהי הזאת מתייתרת


char MString::operator (const int i)

פה מתאים ASSERT לטעמי וזריקת EXCEPTION אני מניח שלא למדת EXCEPTION עדיין

והזכרתי את זה כבר אבל בגדול כל הפניות לקלט להוציא בחוץ.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net