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

שגיאה לוגית בקטע קוד


yonatanph

Recommended Posts

יש פה מיליון שגיאות קומפילציה כי ניסיתי לשחזר מהזכרון בלי להריץ בקומפיילר אבל הפואנטה של השאלה היא לא שגיאת קומפילציה.

בקטע הקוד הבא יש שגיאה לוגית. מה היא ואיך פותרים אותה?

struct{
Int message;
Int param;
} Message;

Q qg;

Push(Q* qg, Message* msg)
Pop(Q* qg, Message* msg)
Foo();

Task A()
{
...
pop(&qg, &msg)


}

Foo()
{
Messege Msg;
Char* message = "New message";

Msg.messege = (int)message;
Msg.param= 1;

Push(&qg,&Msg);
}

Task B()
{


Foo();


}

ורק למקרה שלא היה ברור TASK A ו TASK B הם שתי תהליכים שונים ולא סתם שתי פונקציות. (כלומר שהמטרה פה היא תקשורת בין תהליכים).

אפשר להניח שPOP וPUSH כתובים היטב.

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

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

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

א. צודק - התלבלבתי.

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

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

אוקי אז טאסק איי עושה פופ וטאסק בי עושה פוש

בהנחה ש foo מבצעת פוש בצורה נכונה (אני לגמרי לא בטוח שפוינטר תמיד מיוצג ע"י int זה הרי תלוי במרחב בכתובות של הפלטפורמה)

בהנחה שהמשתנים מוגדרים כמו שצריך (אין הגדרה לmsg בטאסק איי)

נראה לי שאין שום סינכרון בין איי לבי ולכן יש אפשרות שאיי יעשה פופ לתור ריק

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

יש הנחה שPOP וPUSH כתובים היטב -- כלומר אם יש שגיאה היא לא בתוך POP/PUSH (לעשות POP לתור ריק זה שגיאה בתוך POP).

לגבי הCASTING -- מאוד יכול להיות ששם התקלה. אני יותר התמקדתי בעובדה שיש משתנה גלובלי ששתי הTASKים נוגעים בו.

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

ומה בדיוק הבעיה בזה שיש משתנה גלובאלי? רוב הסיכויים שהוא שם בשביל לסנכרן את 2 המתודות.

בכל מקרה אתה בטוח שאתה כותב את השאלה נכון? pop וpush עושים בדיוק אות אותו הדבר, ומה כל הקטע של ה-...?

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

לדעתי השגיאה היא בהגדרת המשתנה Msg בתוך Foo.

בעצם היה צריך ליצור אותו ע"י שימוש באופרטור new, מכיוון שאתה רוצה שהוא יהיה קיים גם מחוץ ל-Foo.

בקיצור הקצאת דינמית.

לעבודה אין קשר לC++ הכל מתבצע ברמה של C וכל מה שמשתמע מכך.

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

לגבי ההערה של שניצל : אם תנסה להבהיר לי מה לא ברור אני אנסה להסביר - עד כמה שאני יכול. השאלה מוצגת בדיוק כמו שהוצגה לי עד כמה שהצלחתי לדייק מהזכרון.

לא היו הסברים/הבהרות מעבר למה שכבר ציינתי - חלק מהתהליך זה לראות איך אתה מסתדר גם עם משהו חדש/לא מוכר/לא 100% מובן. במהלך התשובה אתה יכול לתאר איזה הנחות הנחת. לי לא קופץ לעין שום דבר. לכן לא הייתה לי תשובה של מה בדיוק לא תקין. לכן תיארתי בתשובה שלי איזה הנחות אני מניח ואיזה בדיקות אני אבצע כדי למצוא את הבעיה.

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

אופציה נוספת שחשבתי עליה היא אולי משהו שקשור לCASTING. אני יודע שCASTING של CHAR ל INT זה דרך אחת לבדוק אם מערכת עובדת ב LITTLE או BIG ENDIAN. אבל לא הצלחתי לחשוב על משהו שיגרום שם לשגיאה.

קיויתי שאולי למישהו פה יהיה הערה/הארה שלא חשבתי עליה.

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

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

אני מגיע מעולם הג'אווה (למרות שכתבתי בC לפני יותר מ10 שנים) ושם יש דגש רב על סינכרוניזציה בין ת'ראדים הניגשים למשאבים משותפים כאשר החלק הטריקי הוא לדעת איפה לשים את הבלוק הסינכרוני. במקרה שלנו אם אין בלוק סינכרוני על פעולות שניגשות לתור, יש מצב שיהיה context switch באמצע פעולת ההכנסה או השליפה והתוכן והסטטוס של התור יהפכו ללא יציבים.

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

זאת אכן הייתה ההערה הראשונה שלי והתשובה שלהם הייתה שניתן להניח שPOP וPUSH כתובים היטב (הערה שהוספתי לשאלה).

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

תודה בכל זאת על הנסיון.

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

ארכיון

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

×
  • צור חדש...