עבור לתוכן

עזרה במצביעים בשפת C: (קטע קוד קצר) מדוע זה לא עובד..??

Featured Replies

פורסם

היי,

[קטע הקוד מצורף בקובץ טקסט]

התכנית שלי רצה בלי באגים - הכל תקין.

הוספתי קטע קוד בתכנית, שאומר כך:

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

מה שקורה זה שהתכנית רצה, המחרוזת שמכילה את כל ה- Erros ריקה בהתחלה (ערך NULL), כשיש שגיאה - התכנית מוסיפה Error מסוים למחרוזת של כל ה- Errors, אבל כשהקוד ממשיך הלאה המחרוזת של כל ה Errors שוב חוזרת להיות NULL.....!

מדוע זה קורה???

תודה רבה מראש,

גלעד

[attachment deleted by admin]

פורסם

עדיף שתעלה את הקוד לדיון (שים אותו בתוך code כדי שיהיה קריא).

בכל מקרה...

ברגע שבתוך ()writeToGameLog עשית realloc הרי שmovementLog הפנימי מצביע למקום חדש, בעוד שהחיצוני עדיין NULL. הרי משתנים בC מועברים by value. אם אתה רוצה שהפונקציה הפנימית תשנה את הכתובת שאליה movementLog מצביע, ושהשינוי יתפוס בחוץ, צריך להעביר מצביע למצביע, או כלאלטנרטיבה יותר פשוטה, להחזיר את הערך החדש של המצביע (במקום void).

פורסם
  • מחבר

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

שאלה נוספת ברשותך,

שיניתי את הפוקנציה writeToGameLog כך שהיא בנויה כך:

* מפעילים את פונקציית realloc.

* אם רוצים להוסיץ Error חדש ומחרוזת הErrors ריקה - תעתיק את הError החדש למחרוזת.

* אם המחרוזת אינה ריקה - תשרשר (strcat) את ה Error החדש לסוף המחרוזת.

הכל עובד יפה, אך בפעם הבאה ש realloc מופעלת, היא מגדילה את המחרוזת אבל היא מוסיפה "זכרון זבל" לסוף המחרוזת, כך שלאחר השרשור המחרוזת עשויה להיראות כך לדוגמה:

"Hit.Object wasn't found.Not your turn.Hi$@#$@#$Miss"

מה שכמובן מעיף את התכנית..

מדוע זה קורה לדעתך?

[attachment deleted by admin]

ארכיון

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

דיונים חדשים