אתחול מצביעים ב C - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


גינגית
 Share

Recommended Posts

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

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

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

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

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

זה הקובץ

 

 

 

קישור לתוכן
שתף באתרים אחרים

ישש

תודה!

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

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

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 חיובית מאד, אבל דעתו של הקומפיילר שלי לא כל כך....

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

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

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

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

 

קישור לתוכן
שתף באתרים אחרים

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

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

#define _CRT_SECURE_NO_WARNINGS

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

#define _CRT_SECURE_NO_DEPRECATE

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

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

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

 

קישור לתוכן
שתף באתרים אחרים

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

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

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

נערך על-ידי af db creid
קישור לתוכן
שתף באתרים אחרים

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

נערך על-ידי af db creid
קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

C++

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

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

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

 

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

הצטרפ/י לדיון

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

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
  • צור חדש...