עבור לתוכן

קאסטינג של int ל-enum C++ VS6.0

Featured Replies

פורסם

אהלן אהלן

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

אני מנסה לשלוח לבנאי המסויים בעזרת קאסטינג ובלי והוא לא מקבל את זה

חיפשתי ברשת ובגדול אמרו - nono

יש דרך לעקוף את זה מלבד switch?

א. כי זה די לא אלגנטי

ב. כי זה ארוך מאוד :smile1:

עריכה:

עוד שאלה, אם אני משתמש גם ב-new ים וdeleteים וגם ב-mallocים - אמורה להיות בעייה(הפרסר הוא מתכנית ישנה מאוד)

כלומר האם תהיה לעשות delete למשהו שהוקצה עם calloc לדוגמא?

פורסם

אני מניח שאתה מתכוון ל-++C/C (מומלץ שתרשום את זה בכותרת).

אני רוצה להבין, המשתמש מכניס מספר או מילה?

כלומר, נניח שהenum הוא חודשים, המשתמש צריך להכניס 1 או january?

במקרה הראשון, אתה יכול להשתמש בקאסטינג פשוט.

במקרה השני, הכותרת שלך לא מדוייקת, ואתה חייב להשתמש בשרשרת ifים.

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

פורסם
  • מחבר

המשתמש מכניס 1

מדובר ב-

C++ VS6.0

עריכה:

ההגיון אומר שאתה טועה, כי אם אני שולח int (כשבפונ' מקבלים enum( אני מקבל שגיאה, גם אם אני שם קאסטינג ל-enumerator הספציפי

פורסם

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

פורסם
  • מחבר

תודה רבה שניצל, אני אודה לך אם תוכל לשמור את הת'רד חי עוד קצת זמן אם יהיו עוד קצת שאלות(נקווה שלא) - ועוד יותר אם תענה עליהן ;)

פורסם

למה שאני לא אשמור את הת'רד חי? :)

לגבי הבעיה שאמרת בתגובה הקודמת שלך - זה נשמע לי מוזר... זה לא אמור להיות ככה.

פורסם
  • מחבר

שניצל זה עבד, יש לי בעייה אחרת -

האם יש איזושהי דרך לבצע try בשורת אתחול? אני יודע שזה נשמע עקום אבל פשוט יש לי שרשרת ארוכה של היררכיה וכל אחת משתמשת בבנאי של זה שלפניה (שעלול לזרוק חריגה) בשורת אתחול. אז זה או להוסיף עוד Ctor לכל המחלקות העליונות בהררכייה(ולקנן try\catch block בפנים) , שזה קשה - או לא יודע...

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

אבל אני מקבל על זה warrnings :s07:

פורסם

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

פורסם
  • מחבר

סליחה שלא הסברתי ת'עצמי טוב, אני אנסה בדוגמא:

נניח שיש לך class B:public A

עכשיו ה-Ctor:

B(<long list of A's param's>,<long list of B's param's):A(<long list of A's param's>)

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

אני מקווה שזה יותר ברור ממקודם, אני חושב שעוד יותר סבכתי :-\

פורסם

אוקי, אז הבנאי של A יכול לזרוק exception, וגם הבנאי של B יכול לזרוק exception, כן?

אז מה השאלה..?

פורסם
  • מחבר

זהו גם אני לא ראיתי פה מקום לפרשנויות

רק שאני מקבל warning ב-main, לטענתו אני לא מתייחס ל-exception שנזרק

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

פורסם

איזה סוג של exception אתה זורק ומנסה לתפוס?

חוץ מזה, אתה יכול להעלות קוד לדוגמה? עדיין קצת קשה לי להבין.

פורסם

אל תשים exceptions ב-constructorים, זה מתכון למגוון בעיות (כגון זו שהצגת). אם אתה צריך, תכתוב גם פונקציית init שזורקת.

פורסם
  • מחבר

אל תשים exceptions ב-constructorים, זה מתכון למגוון בעיות (כגון זו שהצגת). אם אתה צריך, תכתוב גם פונקציית init שזורקת.

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

שורת init מסוכנת לאור "זומבי" כמו שמתואר בלינק של שניצל.

ושניצל מצטער שלא שלחתי\העלתי כלום, פשוט כבר הגשתי את זה as is לאור עייפות גדולה ושבירה של איבר גדול.

אני אנסה להמשיך לברר איך לטפל בזה\לעקוף את זה ולכתוב למקרה שמישהו יתקל בבעייה דומה.

תודה רבה על העזרה :xyxthumbs:

ארכיון

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

דיונים חדשים