עבור לתוכן

פוינטרים

Featured Replies

פורסם

כתבתי תכנית (המנסה לממש קוד הופמן) ויש לי בעיה עם מצביעים:

זו התכנית: (יש ערימת מינימום המכילה איברים מסוג TAV . כל פעם לוקחים שני איברים מינימלים- מחברים אותם ומכניסים למקום המתאים בערימה עד שנוצר עץ. אח"כ כל בן ימני מקבל את הקוד 1 ובן שמאלי 0 והקוד של כל תו הוא המסלול אליו מהשורש (יוצא שתו בעל שכיחות נמוכה יהיה לו קוד ארוך, ותו עם שכיחות גבוהה יהיה לו קוד קצר))



struct tav
{
char value;
int incidence;
tav* right;
tav* left;
char *son;
char *kod;


tav();
bool operator<(tav &t) const;
bool operator>(tav &t) const;

};

void Huffman::build()
{
tav lft, rght, ezer;

while(check()==false)
{
lft = heap.RemoveTop();
strcpy(lft.son,"0");
strcpy(lft.kod,"0");

rght = heap.RemoveTop();
strcpy(rght.son,"1");
strcpy(rght.kod,"1");

ezer.incidence = lft.incidence + rght.incidence;
ezer.left = new tav(lft);
ezer.right = new tav(rght);

heap.Insert(ezer);
}

lft = heap.RemoveTop();
strcpy(lft.son,"0");
strcpy(lft.kod,"0");

rght = heap.RemoveTop();
strcpy(rght.son,"1");
strcpy(rght.kod,"1");

ezer.incidence = lft.incidence + rght.incidence;
ezer.left = new tav(lft);
ezer.right = new tav(rght);


heap.Insert(ezer);
root = heap.GetRoot();
{

לי יש בעיה בשורה STRCPY לא תמיד זה מעתיק את מה שאני רוצה (יש פעמים שבמקום 0 בבן שמאלי ו1 בבן ימני יש לי 0 או אחד בשני הבנים).

עברתי עם דיבגר על התכנית וראיתי שבפעמים שהשדה SON קיבל את אותם הערכים יש להם אותה כתובת.

מה צריך לתקן??????

פורסם

למה את עושה strspy עם תו אחד כל הזמן? את לא אמורה בכלל לשמור את הביט(את יכולה לגלות את הביט אם הוא בן ימיני או שמאלי של האב שלו).

ולמה את שומרת את הincidence?

העץ אמור להיות מלא ששומר רק את הביטויים שאת "מכווצת", לא יותר.

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

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

תבדקי את הnew tav(lft( וה- new tav(rght)

פורסם
  • מחבר

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

את הINCIDENCE אני שומרת כדי לבנות את העץ, אח"כ אני לא צריכה אותו יותר (איך אפשר לשמור אותו כמשתנה זמני? הרי אני מכניסה את הקודקוד המאוחד לעץ? ).

העץ אמור להיות מלא ששומר רק את הביטויים שאת "מכווצת", לא יותר.

מומלץ לשמור את העץ כרצף של ביטים.

->לא הבנתי מה הכוונה.

והבעיה היא: לפעמים ההעתקה עובדת כמו שאני רוצה (לבן ימני שם 1 ולשמאלי 0), ולפעמים לא.

מה לא טוב?

פורסם

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

שימי לב שאת לא צריכה לעשות new tav, אלא פשוט לעשות ezer.left = lft.

ותחשבי האם את באמת צריכה לעשות את הstrcpy. לפי דעתי הוא דיי מיותר.

פורסם

בהנחה שלא רשמת את כל הקוד, הבעיה עם strcpy יכולה להיות שאת לא הקצאת מקום ל son ו kod ?

לעשות strcpy בלי לאתחל אותם זה חתיכת בעייה...

ארכיון

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

דיונים חדשים