פורסם 2020 בנובמבר 115 שנים יש לי שיעורי בית לכתוב פונקציה שמקבלת מחרוזת (מערך כמובן) ומספר N, ומסובבת את המחרוזת בצורה מעגלית (התו האחרון הופך להיות ראשון) N פעמים כתבתי פונקציה שמסובבת, ופונקציה עוטפת שמזמנת אותה N פעמים בפעם הראשונה היא עובדת מצוין, בפעמים הבאות - המחרוזת שנשלחת היא המחרוזת שכבר סובבה פעם אחת, אבל ברגע שנכנסים לפונקציה המצביע מתאפס, כל המחרוזות הופכות להיות ריקות, והפונקציה מפסיקה לעבוד. ניסיתי גם כפונקציה שמחזירה מחרוזת וגם כפונקציה שעובדת על המצביעים, כלום לא עזר מה יכולה להיות הבעיה? זה הקובץ
פורסם 2020 בנובמבר 115 שנים מזלך שהתאפס אם תשימי לב, את מחזירה מצביע לnewStr שהוא משתנה לוקאלי. הוא מושמד ביציאה מהפונקציה, והמצביע אליו לא תקין יותר. נערך 2020 בנובמבר 115 שנים על-ידי af db creid
פורסם 2020 בנובמבר 125 שנים מחבר ישש תודה! הנה הפונקציה המתוקנת: אם אפשר להבין ככה משהו..... 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++); } }
פורסם 2020 בנובמבר 125 שנים מה דעתך על strcpy? בנוסף, שימי לב שהמחרוזת מוגבלת אצלך ל19 תווים. אם תרצי יש לי עוד כמה הערות
פורסם 2020 בנובמבר 125 שנים מחבר קודם כל - אני רוצה, כן,אבל בעדינות....😔 דבר שני - דעתי על strcpy חיובית מאד, אבל דעתו של הקומפיילר שלי לא כל כך.... אין לי מושג למה אבל הוא לא נותן לי להשתמש בפונקציה הזאת, אז אני נאלצת להשתמש בתחליפים פרימיטיביים יותר.... ואכן, היא מוגבלת באורך, כי אני לא יודעת איך לעשות את זה אחרת הרי אם אני מגדירה מצביע ולא מאתחלת אותו הוא לא מקבל כתובת, ואז אי אפשר להוסיף לו ערכים, לא? כנראה שפספסתי בשיעור את ההסבר על העניין הזה, וכבר לא היה לי כוח לחפש....
פורסם 2020 בנובמבר 125 שנים הערות נוספות אולי אח"כ\ עכשיו אין לי כ"כ כוח... הקומפיילר שלך הוא MICROSOFT VISUAL C++, נכון? הוא כותב לך משהו כמו שהפונקציה לא בטוחה לשימוש? המרצה היה אמור להסביר על זה . טכנית, הוא צודק, אבל הפיתרון שהוא מציע לא כ"כ כדאי (בטח לא למתחילים), ולכתוב את הפונקציה בעצמך זו השטות הכי גדולה . במקום זאת, בתחילת התוכנית, לפני הinclude <cstring>, וכדאי לפני כל הincludeים, תגדירי: #define _CRT_SECURE_NO_WARNINGS או (לבחירתך): #define _CRT_SECURE_NO_DEPRECATE זה מכבה את האזהרה הזו. לגבי מצביע, את צודקת. בד"כ בשיעורים במדמ"ח (לפחות בהתחלה) יאמרו שאת צריכה לטפל רק במחרוזות עד גודל X. כדי לטפל במחרוזת בכל גודל את צריכה הקצאת זיכרון דינמית, אם תרצי אני יכול להסביר כאן.
פורסם 2020 בנובמבר 125 שנים מחבר הידע השופע הזה זה משהו שיקרה גם לי בסוף? זאת באמת ההתראה שקיבלתי, וגם ניסיתי להשתמש בפונקציה המוצעת, אבל כצפוי לא הסתדרתי איתה... (רק בגלל שאני מתחילה ) הקצאה דינמית זה אותו עיקרון של מה שלומדים במבני נתונים? לא המימוש ב C , העיקרון. המימוש של זה ב C נשמע כמו משהו קשוח. ולמה זו שטות כל כך גדולה לכתוב בעצמי? סתם חיסכון של זמן? כי אולי בחיים האמיתיים (בעבודה...) זה שטות , אבל בתור תרגול לא נראה לי שזה כל כך גרוע....
פורסם 2020 בנובמבר 125 שנים שום דבר לא גרוע בתור תרגול הפיתרון עבד לך? זה גרוע לכתוב בעצמך בעיקר כי מישהו אחר שיעבור על הקוד לא יבין למען השם מה את עושה כאן הקצאה דינמית לא כ"כ קשורה למבני נתונים, אם כי קצת. עקרונית זה הרעיון של בזמן ריצה, להגיד לקומפיילר (או ליתר דיוק למערכת ההפעלה) כמה זיכרון התוכנית שלך צריכה. ככה את מודדת את האורך של המחרוזת, ואז מבקשת ממערכת ההפעלה מספיק זיכרון כדי להעתיק אותה (פלוס 1! מיליון פעמים תטעי בזה... למה?) נערך 2020 בנובמבר 125 שנים על-ידי af db creid
פורסם 2020 בנובמבר 125 שנים רק כהרחבה, מה שהוא מציע strcpy_s זו פונקציה של microsoft (כיום סטנדרט, אע"פ שלא נדרש) שדומה מאוד לstrcpy (או ליתר דיוק strncpy) רק שהיא מוודאת שלא בטעות תחרגי מגבולות הזיכרון שלך. נערך 2020 בנובמבר 125 שנים על-ידי af db creid
פורסם 2020 בנובמבר 125 שנים מחבר אולי עכשיו אני אתבלבל רק חצי מיליון.... והתבלבלתי עם מערך דינמי וכן, הפתרון עבד... ולפחות מישהו אחד אחר הבין מה עשיתי שם... ואם כבר - אז למדנו שאחרי כל מחרוזת מופיע אסקי אפס, ולכן כדי לעבור על כל המחרוזת צריך לעשות while כשהתנאי הוא שה char במקום הנוכחי לא שווה 0, אבל זה לא עוצר לי את הלולאה, המצביע ממשיך להתקדם ועובר לי מחרוזות הבאות שנמצאות בזיכרון. זה נשמע לי כל כך מופרך, אבל פשוט זה מה שקורה, שעות של דיבוג עד שהבנתי את זה....
פורסם 2020 בנובמבר 125 שנים מחבר C++ יש בויזואל סטודיו 2019 אפשרות אחרת בכלל? והקוד הוא אותו קוד של קודם, תראה שם שכדי לעבור על המחרוזת השתמשתי ב while isAlpha, שזה פתרון קצת מגומגם, פשוט כי כשעשיתי while str הלולאה המשיכה עד אין קץ....
פורסם 2020 בנובמבר 125 שנים קצת (מגומגם)? הרבה! זה לא יעבוד עם כל תו! יש בVS גם C, כברירת מחדל קובץ עם סיומת .c הוא C ואפשר גם לשנות בהגדרות הקובץ. אבל התכוונתי מה אתם לומדים, אחרי הכל כמעט כל קוד C הוא גם C++ תקין אבל הקצאה דינמית שונה מאוד בין השתיים. מערכים דינמיים ממומשים באמצעות הקצאה דינמית, אגב תני לי שנייה לעבור על הקוד...
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.