שאלות תרגיל בית 1

תהיה לגבי שימוש במאקרו

תהיה לגבי שימוש במאקרו

על ידי גאי שמש בתאריך
מספר תגובות: 5

היי,

על מנת לחסוך שימוש בהקצאות דינמיות עבור מחרוזות בגודל חסום (המרת int ל string) השתמשנו בקוד במערכים בגודל סטטי על מנת לשמור את המחרוזת המייצגת של המספר כ string. דבר זה הוביל לחזרה על שורות בסגנון: 

כאשר convertIntToString היא פונקציה שמימשנו, שמבצעת את ההמרה לעיל וכותבת את התוצאה למערך.

 

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

 

תודה מראש !

 
בתגובה ל: גאי שמש

תשובה ל: תהיה לגבי שימוש במאקרו

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

תשובה ל: תהיה לגבי שימוש במאקרו

על ידי יובל שפירא בתאריך
לא ברור לי איך שימוש ב-inline function פותר את הבעיה?
כדי להמנע מהקצאות דינמיות עבור המחרוזות יש צורך בלהגדיר את המערך ב-scope בו אנו צריכים שהוא יהיה מוגדר, אי אפשר להגדיר את המערך בצורה סטטית בתוך פונקציה אחרת ואז להחזיר אותו ממנה כי הוא ינוקה מהמחסנית ביציאה מהפונקציה, inline function היא סוג של פונקציה ולפי מה שלמדנו אין הבטחה שהקומפיילר אכן יעשה inline לפונקציה אלא זאת רק המלצה, במידה ואכן תתרחש קריאה לפונקציה נפרדת פעולה כזאת תגרום לחריגת זכרון, אני מפספס פה משהו?
אני מבין שלמאקרו יש המון חסרונות אבל בהתאם למה שכתבתי למעלה אנחנו לא מוצאים דרך אחרת בה אפשר יהיה גם להגדיר מערך וגם לאכלס אותו בערכים שמגיעים ממשתנים בקוד בלי להפריד את זה לשתי שורות שונות, לפי מה שאני מסיק מפה כיוון שהשימוש במאקרו לא מומלץ ובגלל ששימוש בשתי שורות שונות נחשב לשכפול קוד אז למעשה אנחנו בעצם לא יכולים להשתמש במערכים סטטיים כדי להחזיק באופן זמני מחרוזות ואין לנו ברירה אלא להקצות את המחרוזות בצורה דינמית?

תודה רבה!
בתגובה ל: יובל שפירא

תשובה ל: תהיה לגבי שימוש במאקרו

על ידי אורטל כהן בתאריך
הבנתי למה אתה מתכוון. (לא שמתי לב שהתכוונתם ל-2 שורות).
במקרה הזה באמת יש לכם 3 אפשרויות:
1. להקצות את המחרוזות בצורה דינאמית, וכאשר אתם מסיימים להשתמש בהם ישר לשחרר את הזכרון.
2. באמת להשאיר את הקוד כפי שהוא, עם החזרה על 2 שורות (שהראשונה מהן קשורה לניהול זכרון - הקצאת זכרון לוקאלית).
3. לכתוב מאקרו אם אתם רוצים - במקרה זה כדאי לכם לפני השימוש במאקרו לבצע המון בדיקות (ולזכור שהוא רק מחליף את הטקסט).
זה נתון להחלטתכם - בכל אפשרות יש יתרונות וחסרונות. (חלק מהן כתבתי).