תחזוק משתנה

הוליסטי

New member
תחזוק משתנה

אהלן, שאלה בתיכנון. יש לי טבלה של נתונים. לפעמים מכניסים לה ערך ולפעמים מוציאים ממנה ערך. יש לי משתנה (num_of_nv_static_rout_entries) שמחזיק את מספר השורות בטבלה. כשמוצאים ערך, הוא יכול להיות מכל מקום בטבלה כך שמהר מאוד יווצרו בה "חורים". אני רוצה להוסיף משתנה (נגיד: higher_index_in_table) שישמור מהו האינדקס המקסימלי בטבלה. כלומר, כל האינדקסים מעליו בהכרח ריקים. כמובן שמתחתיו יכול להיות שיהיו גם אינדקסים רקים. הבעיה העיקרית: נניח higher_index_in_table = 10 ונגיד ששורות 8 ו-9 ריקות. עכשיו אני מוחק את שורה 10 ולכן higher_index_in_table צריך להיות = 7. (לגבי num_of_nv_static_rout_entries אין ממש בעיה). יש למישהו רעיון ? תודה מראש
 

gmorph

New member
אתה בעצם מנסה לתחזק heap

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

הוליסטי

New member
כנראה שלא הסברתי נכון

זוהי לא ערמה. ישנו מערך שכל תא בו הוא struct מסוים. המערך סטטי עם מספר X של תאים. לתא במערך אפשר להכניס נתונים או "למחוק" את התא. (ההכנסה היא מילוי ערכי אותו struct ומחיקה היא איפוס כל הערכים). התא הנבחר להכנסה של ערך חדש הוא התא המאופס הראשון (האינדקס הקטן ביותר שלא מלא). כמובן שיש בדיקה של over-flow. מחיקה: מוצאים את התא הרצוי למחיקה (לפי אחד מערכי הstruct) ומאפסים אותו (כמו שהסברתי למעלה). אין לי דרך לשמור רשימות.
 

vinney

Well-known member
למה אתה לא עושה רשימה מקושרת?

זה די פותר לך את הבעיה... (למרות שפתרון של רן מצוין אם אתה מתעקש על מערך)
 

® רן

New member
התשובה בגוף השאלה

אתה צריך לתחזק את משתנה ה higher_index_in_table בכל פעם שמוסיפים או מוחקים שורה. כל פעם שמוחקים שורה, תרוץ החל מהערך הנוכחי של higher_index_in_table אחורה עד שתמצא שורה מאוכלסת, ותציב בו ערך אחד פחות. לדוגמא: 1. שורה מלאה 2. ----- 3. שורה מלאה 4. ----- 5. ----- 6. שורה מלאה 7. ----- <- higher_index_in_table מצביע לפה עכשיו עם מוחקים את שורה 6, התחל לסרוק החל מהערך הנוכחי של המצביע (7) עד שתגיע לשורה מלאה (שורה 3), ותציב במשתנה מספר שהוא אחד יותר (4).
 

הוליסטי

New member
../images/Emo51.gif

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

vinney

Well-known member
במערכת embedded זה לא טוב

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

הוליסטי

New member
אהלן - טיפונת ארוך

המשתנה בא לפתור בעיה בריצה על טבלה ע"י get-next בSNMP במערכת. יש לנו פונקציה שמחזירה את האינדקס הבא של הטבלה (שכאמור יכולה להיות מחוררת). הפונקציה פשוטה: מקבלת כפרמטר את האינדקס העכשווי. יש בה לולאת while שאומרת: כל עוד תא X וגם תא Y באינדקס לא חוקיים, הזז קדימה את האינדקס באחד (וכמובן יש את התנאי שלא עברנו את גודל הטבלה). בפונקציה שקראה לזו בודקים אם האינדקס == גודל הטבלה. אם כן, זה אומר שסיימנו את קריאת הטבלה ואז מחזירים OID הבא עבור סוף קריאות get-next... כתוצאה מליכלוך בזיכרון (בגלל שימוש לא נכון במוצר) הטבלה התלכלכה, זה בילבל את המערכת והNMS לא קיבל תשובה שהטבלה הסתיימה (ע"י קבלת OID שונה). רציתי שהמשתנה עליו דיברתי יגלה שעברנו את מספר האינדקס המקסימלי (כלומר היה ליכלוך). התיקון שמצאנו, ופה זה ממש טריוויאלי .... בלולאת הwhile המוזכרת למעלה - הוספת תנאים ושינוי ל || במקום && ... לא צריך משתנה עזר ... עד כדי כך זה היה פשוט
 
למעלה