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

אחזור גודל נערך דינמי


פיני1805

Recommended Posts

שלום אנשים

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

שאלה ב-C++. תודה על העזרה

מה הבעיה לעבור על המערך, כל עוד התוכן של כל תא (ולמעשה- הכתובת שהוא מכיל) שונה מ NULL- תעלה את המונה, וכאשר אתה מגיע ל NULL צא מהלולאה.

עשיתי משהו דומה בתרגיל גדול יותר, אבל הוא בככל זוועה ><

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

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

אתה בטוח?

אני חושב שזה יחזיר תוצאה לשאלה- "כמה תאים מאותחלים במערך, ומצביעים על איזשהו תא", שזו השאלה שהאלגוריתם מנסה לענות עליה.

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

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

מה מבטיח לך שאחרי המערך התאים הבאים מכילים 0 (NULL)?

זו הנחה לא נכונה

זאת הסיבה שהצעתי 'לאפס' את כל המערך, ע"י הכנסת הערך NULL לכל המצביעים. (ובאופן כללי- NULL הוא לא 0, הוא התו שערך הASCII שלו הוא '0').

אתה מדבר על מה שהפותח שאל או מה שאתה שאלת ?

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

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

וגם מה הקשר ?

יהיה נחמד אם תסביר את מה שהתכוונת להביע במילים האלו, אני לא הבנתי...

תחשוב שכל התאים מלאים ואחרי זה יש זבל בזיכרון או משהו אחר...

אתה מתכוון ל:

מצב שבו אחד התאים מצביע לכתובת לא נכונה, לכתובת של "תא זבל"?

זאת כבר לא אמורה להיות הבעיה של האלגוריתם למציאת האורך.

מצב שבו מצאנו את גודל המערך, ואח"כ השתנה אחד התאים?

במצב הזה צריך לסדר את המערך מחדש, ככה שהמצביע ל"תא הזבל" יהיה האיבר האחרון, לשחרר אותו, ואז להריץ את אלגוריתם האורך שוב. זה לא כ"כ מסובך, עשיתי משהו כזה בתרגיל עם מחרוזות...

יש רצף של תאים נכונים, תא שגוי, ואחריו עוד תאים רגילים?

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

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

קודם כל, NULL הוא בדיוק 0. למעשה, בקומפיילרים מסויימים, NULL מוגדר ע"י:

#define NULL ((void*)0)

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

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

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

זאת הסיבה שהצעתי 'לאפס' את כל המערך, ע"י הכנסת הערך NULL לכל המצביעים. (ובאופן כללי- NULL הוא לא 0, הוא התו שערך הASCII שלו הוא '0').

זה עדיין לא מספיק טוב

אם כל המערך מלא אז אין בו אף NULL ואז פשוט תגלוש מהמארך

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

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

זה עדיין לא מספיק טוב

אם כל המערך מלא אז אין בו אף NULL ואז פשוט תגלוש מהמארך

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

לא, אני רק אגיד לך להוסיף לתנאי של האלגוריתם למציאת האורך, את התנאי legth<N, כאשר N מוגדר כגודל המערך (יכול להיות גם length<size במקרה בו המערך מוקצה באופן דינאמי או משהו דומה...)

check what null is again and read the question again

קודם כל, NULL הוא בדיוק 0. למעשה, בקומפיילרים מסויימים, NULL מוגדר ע"י:

#define NULL ((void*)0)

בדקתי, ולא מצאתי (בכוחות עצמי בלבד) איזכור לזה ש NULL שווה לאפס, רק ניסיון עם Visual C++ באמת הראה משהו דומה, כשהוא התיחס ל 0 ללא מרכאות כ NULL.

בכל אופן, תודה שהארתם את עיניי בנושא.

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

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

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

הפתרון שלי דורש המון מהתוכנה? >:(

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

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

האם האתחול המוזר של המערך, אינו נאה בעיניך? זה מה שאני מצליח לחשוב עליו.

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

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

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

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

לא, אני רק אגיד לך להוסיף לתנאי של האלגוריתם למציאת האורך, את התנאי legth<N, כאשר N מוגדר כגודל המערך (יכול להיות גם length<size במקרה בו המערך מוקצה באופן דינאמי או משהו דומה...).

אז במקום להחזיק את ה-size תחזיק כבר כמה תאים מלאים

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

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

אז במקום להחזיק את ה-size תחזיק כבר כמה תאים מלאים

לא הבנתי את מה שכתבת כאן, משתי סיבות:

* אם לא תחזיק ב size, איך בדיוק אתה מתכוון להצהיר על מערך דינאמי?

* לא הבנתי למה התכוונת ב"תחזיק כבר כמה תאים מלאים". תוכל להסביר את כוונתך?

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

האם אתה מעדיף פתרון שאינו דורש יותר מדי משאבים (קרי- משחרר לנו כ 4byte אם אני לא טועה), על פני פתרון איכותי?

- ולא שאני אומר שהפתרון שלי איכותי-משהו, הוא צריך עוד המון עבודה עליו כדי להפוך לשפוי.

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

האם אתה מתכנן לדרוש מהן להריץ את אלגוריתם בדיקת האורך שוב?

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...