פוינטרים

yhaim

New member
פוינטרים

נתון הקוד הבא: int string:: operator -=(char tav) { char *new_s,*tmp,*tmp2; if(!(new_s=new char[strlen(s)+1])) return 0; for(tmp=s,tmp2=new_s;tmp;tmp++) { if(*tmp != tav) { *tmp2=*tmp; tmp2++; } } *tmp2=NULL; delete s; s=new_s; return strlen(s); } משום מה בשלב ההרצה התכנית נתקעת בתנאי. אבל התנאי רשום נכון. אם למישהו יש רעיוןאשמח לדעת.
 

אלדד28

New member
הבעיה היא ב-for.

במקום :
for(tmp=s,tmp2=new_s;tmp;tmp++)​
צריך להיות :
for(tmp=s,tmp2=new_s;*tmp;tmp++)​
כי אתה צריך לרוץ עד שתיתקל ב-null בתור תו. ה-for שלך ירוץ תיאורטית עד ש-tmp יגיע ל-0 (ככתובת). תיאורטית - כי התוכנית תעוף הרבה לפני שזה יקרה. וההערה של metheny גם היא במקום. לא בדקת בכלל את s, איך אתה מוודא ש-s הוא לא null? ועוד הערה, עשית delete s בסוף הפונקציה. זה לא נכון, כי s הוא (אני מניח) מערך של char. זה אומר שאתה צריך לעשות delete []s, ולא כמו שעשית. ועוד הערת יעילות קטנה, במקום לקרוא ל-strlen בסוף, עדיף לספור כמה תווים יש ב-new_s, בעזרת הלולאה (אפשר בסוף הלולאה לחשב כמה זה tmp2-new_s, למשל).
 
זו לא הטעות היחידה פה...שים לב

בהגדרת הfor, יש ; ולא , רגיל!
for(tmp=s;tmp2=new_s;*tmp;tmp++)​
 

אלדד28

New member
אתה טועה ומטעה,

הפסיק שהוא נתן היה בין שתי הגדרות אתחול, שזה בסדר גמור (אם כי מכוער). מה שאתה עשית הוביל לארבעה חלקים ב-for, שזו כמובן שגיאה.
 

אלדד28

New member
הבעיה היא ב-for.

במקום :
for(tmp=s,tmp2=new_s;tmp;tmp++)​
צריך להיות :
for(tmp=s,tmp2=new_s;*tmp;tmp++)​
כי אתה צריך לרוץ עד שתיתקל ב-null בתור תו. ה-for שלך ירוץ תיאורטית עד ש-tmp יגיע ל-0 (ככתובת). תיאורטית - כי התוכנית תעוף הרבה לפני שזה יקרה. וההערה של metheny גם היא במקום. לא בדקת בכלל את s, איך אתה מוודא ש-s הוא לא null? ועוד הערה, עשית delete s בסוף הפונקציה. זה לא נכון, כי s הוא (אני מניח) מערך של char. זה אומר שאתה צריך לעשות delete []s, ולא כמו שעשית. ועוד הערת יעילות קטנה, במקום לקרוא ל-strlen בסוף, עדיף לספור כמה תווים יש ב-new_s, בעזרת הלולאה (אפשר בסוף הלולאה לחשב כמה זה tmp2-new_s, למשל).
 

tami120

New member
תנסה את זה

הפונק' מקבלת עוד פרמטר str -שזה s בפונק' שלך פשוט הוא לא הוגדר בשום מקום השתמשתי ב strchr כך שכל פעם בודקים אם התו מופיע ממקום מסויים במחרוזת עד סוף המערך . אם נמצא התו נציב את str כך שיצביע למקום שאחרי המופע הראשון וממשיכים לרוץ בלולאה אם לא str מקבל ערך null ונצא מהלולאה אני חושבת שזה בסדר.
 

tami120

New member
עכשיו שמתי לב שזאת בכלל לא השאלה

אז אל תתיחס-טעות שלי
 

tami120

New member
אפשר....

אתה יכול לחשב את ה strlen(str) בהתחלה לשמור את ערכו ובסוף לחסר אותו עם count
 
למעלה