ABA


"|++C| קטע קוד קטן שקורס ללא סיבה שמובנת לי - אני משתגע!"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15857 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15857
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:01   30.04.10   
אל הפורום  
  |++C| קטע קוד קטן שקורס ללא סיבה שמובנת לי - אני משתגע!  
 


התוכנית קורסת בפעולת ה-delete
ההקצאה מתבצעת בשורה הראשונה, אחר כך אני מעתיק מ-rawstring ללא רווחים(או טאבים, או אנטר...).

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

הודעת השגיאה:



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

  האשכול     מחבר     תאריך כתיבה     מספר  
  סיבה אפשרית (אולי?) Zippo  30.04.10 00:07 1
     משהו מוזר ביותר שעכשיו גיליתי: Zippo  30.04.10 00:52 2
         איך מתבצעת ההעתקה בפונקציה שמעתיקה ללא רווחים? פאביו ג'וניור 30.04.10 02:48 3
             היא מעתיקה תא תא... Zippo  30.04.10 10:20 4
  לא התעמקתי אבל יש שם באג בולט D-KinG 30.04.10 10:36 5
     נכון, אבל אם יש לי תו יחיד ולאחריו NULL Zippo  30.04.10 12:19 7
  ממה שאני זוכר VeNom  30.04.10 10:47 6
     גדול אתה! איך לא חשבתי על זה.!?!? Zippo  30.04.10 12:21 8
         מצויין! הבעיה נפתרה!!! Zippo  30.04.10 12:26 9

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:07   30.04.10   
אל הפורום  
  1. סיבה אפשרית (אולי?)  
בתגובה להודעה מספר 0
 
אני מקצה מחרוזת יחסית גדולה, ואח"כ משתמש בחלק יחסית קטן ממנה,
ואני שם NULL באופן ידני כדי לסמן את סוף המחרוזת.
ככה שלא רק שלא חרגתי מגבולות ההקצאה, השתמשתי בפחות.

יכול להיות ש-delete מאיזשהיא סיבה מתחשב במחרוזת רק עד ה-NULL?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:52   30.04.10   
אל הפורום  
  2. משהו מוזר ביותר שעכשיו גיליתי:  
בתגובה להודעה מספר 1
 
קטע הקוד הזה למעלה, הוא הקונסטרקטור של מחלקה בשם Polynom
הערכים שהקונסטרקטור מקבל הם ערך אינט שמטופל בשורת איתחול ומחרוזת.

כאשר אני קולט את המחרוזת ב-cin, הכל רץ חלק. עובד פרפקט.
כאשר המחרוזת מגיעה hard-coded כלומר קבועה מראש, למשל:


Polynom new_poly(id,"hard_coded_string");

רק אז נוצרת הבעיה.
למה זה?


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

   02:48   30.04.10   
אל הפורום  
  3. איך מתבצעת ההעתקה בפונקציה שמעתיקה ללא רווחים?  
בתגובה להודעה מספר 2
 
   כי אם היא לא מעתיקה עם STRCPY או תא תא אלה מעתיקה כתובות זאת הסיבה... תן את הקוד שלה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   10:20   30.04.10   
אל הפורום  
  4. היא מעתיקה תא תא...  
בתגובה להודעה מספר 3
 
ערכתי לאחרונה בתאריך 30.04.10 בשעה 10:28 בברכה, Zippo
 


מה גם, שאם תסתכל בתמונה הראשונה, בדיבאג, אני מראה של-poly יש כתובת תקינה... (mouseover על המשתנה...)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   10:36   30.04.10   
אל הפורום  
  5. לא התעמקתי אבל יש שם באג בולט  
בתגובה להודעה מספר 0
 
   תזכור ש-strlen מחזירה אורך לא כולל ה-null


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   12:19   30.04.10   
אל הפורום  
  7. נכון, אבל אם יש לי תו יחיד ולאחריו NULL  
בתגובה להודעה מספר 5
 
strlen יחזיר לי אורך: 1
אבל string=NULL ו- string=char כלומר זה מתקזז בגלל שהתו הראשון נמצא בתא מספר אפס ובסה"כ זה יוצא בסדר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   10:47   30.04.10   
אל הפורום  
  6. ממה שאני זוכר  
בתגובה להודעה מספר 0
 
   הרבה בעיות של delete נוצרות מזה שהקצאת מקום מסויים נגיד בגודל n לצורך משהו..ובעצם הגודל שנכנס למקום הזה היא גדול מ n ולכן נוצרה גלישה..ושאתה בא למחוק משהו של עם גלישה יש שגיאה כזאת..
אז סתם בשביל הבדיקה תכפיל את ההקצאה שלך של פולי בפי 2..אם זה מתקמפל אז לא הקצאת מספיק..
זה בד"כ קורה עם מחרוזות..נגיד המצב הבא:

char str[] = "check";//5 chars + '\0' = 6
int len = strlen(str);//length is 5
char* copyStr = new char[len];
copyStr(str,copyStr);//method that clones the string
עכשיו במצב של מחיקה של copyStr
אתה תכשל כי לא הקצאה תו נוסף לתו שמסיים מחרוזת


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   12:21   30.04.10   
אל הפורום  
  8. גדול אתה! איך לא חשבתי על זה.!?!?  
בתגובה להודעה מספר 6
 
באמת המחרוזת שהכנסתי hard-coded הייתה ללא רווחים, כלומר חסר לי תו ל-NULL. ולכן גם קלט מהיוזר היה בסדר, כי אני מדלג על EOL בסוף הקלט גם אם לא היו רווחים.

אני רץ לנסות..!

תודה רבה!!! (כבר מעדכן אם זאת הייתה הבעיה...)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   12:26   30.04.10   
אל הפורום  
  9. מצויין! הבעיה נפתרה!!!  
בתגובה להודעה מספר 8
 
פשוט הקצאתי תו נוסף עבור NULL!

תודה רבה!


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

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

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



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