עבור לתוכן

אתחול מצביעים ב C

Featured Replies

פורסם

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

כתבתי פונקציה שמסובבת, ופונקציה עוטפת שמזמנת אותה N פעמים

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

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

מה יכולה להיות הבעיה?

זה הקובץ

 

 

 

פורסם

מזלך שהתאפס :)

 

אם תשימי לב, את מחזירה מצביע לnewStr שהוא משתנה לוקאלי. הוא מושמד ביציאה מהפונקציה, והמצביע אליו לא תקין יותר.

נערך על-ידי af db creid

פורסם
  • מחבר

ישש

תודה!

הנה הפונקציה המתוקנת:

אם אפשר להבין ככה משהו.....

void funcTurn(char* str) {
    char newStr[20] = {0}, * place, * start;
    place = newStr+1;
    start = str;
    while (isalpha(*start))
    {
        if (*(start + 1)==0) {
            *newStr = *start;
            break;
        }
        else {
            *(place++) = *(start++);
        }
    }
    start = str;
    place = newStr;
    while (isalpha(*place))
    {
        *(start++) = *(place++);
    }
}

פורסם

מה דעתך על strcpy? ;)

בנוסף, שימי לב שהמחרוזת מוגבלת אצלך ל19 תווים.

אם תרצי יש לי עוד כמה הערות :)

פורסם
  • מחבר

קודם כל - אני רוצה, כן,אבל בעדינות....😔

דבר שני - דעתי על strcpy חיובית מאד, אבל דעתו של הקומפיילר שלי לא כל כך....

אין לי מושג למה אבל הוא לא נותן לי להשתמש בפונקציה הזאת,  אז אני נאלצת להשתמש בתחליפים פרימיטיביים יותר....

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

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

כנראה שפספסתי בשיעור את ההסבר על העניין הזה, וכבר לא היה לי כוח לחפש....

 

פורסם

הערות נוספות אולי אח"כ\ עכשיו אין לי כ"כ כוח...

הקומפיילר שלך הוא MICROSOFT VISUAL C++, נכון? הוא כותב לך משהו כמו שהפונקציה לא בטוחה לשימוש? המרצה היה אמור להסביר על זה :). טכנית, הוא צודק, אבל הפיתרון שהוא מציע לא כ"כ כדאי (בטח לא למתחילים), ולכתוב את הפונקציה בעצמך זו השטות הכי גדולה :). במקום זאת, בתחילת התוכנית, לפני הinclude <cstring>, וכדאי לפני כל הincludeים, תגדירי:

#define _CRT_SECURE_NO_WARNINGS

או (לבחירתך):

#define _CRT_SECURE_NO_DEPRECATE

זה מכבה את האזהרה הזו.

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

פורסם
  • מחבר

הידע השופע הזה זה משהו שיקרה גם לי בסוף?

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

הקצאה דינמית זה אותו עיקרון של מה שלומדים במבני נתונים?  לא  המימוש ב C , העיקרון.

המימוש של זה ב C נשמע כמו משהו קשוח.

ולמה זו שטות כל כך גדולה לכתוב בעצמי?

סתם חיסכון של זמן?

כי אולי בחיים האמיתיים (בעבודה...) זה שטות , אבל בתור תרגול לא נראה לי שזה כל כך גרוע....

 

פורסם

שום דבר לא גרוע בתור תרגול :) הפיתרון עבד לך?

זה גרוע לכתוב בעצמך בעיקר כי מישהו אחר שיעבור על הקוד לא יבין למען השם מה את עושה כאן :)

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

נערך על-ידי af db creid

פורסם

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

נערך על-ידי af db creid

פורסם
  • מחבר

אולי עכשיו אני אתבלבל רק חצי מיליון....

והתבלבלתי עם מערך דינמי🤥

וכן, הפתרון עבד...

ולפחות מישהו אחד אחר הבין מה עשיתי שם...

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

פורסם

אגב, C או C++?

פורסם

הקוד? קצת קשה בלעדיו, את יודעת :)

פורסם
  • מחבר

C++

יש בויזואל סטודיו 2019 אפשרות אחרת בכלל?

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

while isAlpha, שזה פתרון קצת מגומגם, פשוט כי כשעשיתי while str הלולאה המשיכה עד אין קץ....

 

פורסם

קצת (מגומגם)? הרבה! זה לא יעבוד עם כל תו!

יש בVS גם C, כברירת מחדל קובץ עם סיומת .c הוא C ואפשר גם לשנות בהגדרות הקובץ. אבל התכוונתי מה אתם לומדים, אחרי הכל כמעט כל קוד C הוא גם C++ תקין אבל הקצאה דינמית שונה מאוד בין השתיים.

מערכים דינמיים ממומשים באמצעות הקצאה דינמית, אגב :)

תני לי שנייה לעבור על הקוד...

פורסם

הבעיה היא שאת לא מעתיקה את הnull.

ארכיון

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

דיונים חדשים