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