שאלה לגבי enum

operationss

New member
שאלה לגבי enum

נאמר ואני מגדיר enum ומציב לתוכו ערך. איך אני יכול להדפיס את המחרוזת המתאימה לערך הזה ? עלי לכתוב פונקציה מיוחדת שתקבל ערך int ותחזיר מחרוזת ?
 

ihovav

New member
מה הכוונה ?

אם הכוונה שאתה תעביר לפונקציה ENUM ותקבל חזרה מחרוזת - יש לי פתרון בשבילך : תיצור STRUCT בעל 2 שדות - ENUM - INT באחד ובשני מחרוזת - כאשר תיצור מערך של מבנים כאלו לפי כמות ה ENUM'S שלך - ותאתחל אותו בתחילת התכנית כל מה שהפונקציה עושה היא לרוץ על המערך ולהשוות עם ה ENUM שהיא קיבלה, כשהיא מוצאת היא תחזיר את השדה של המחרוזת שמצורך במבנה...
 

operationss

New member
הכוונה היא :

enum day {sun,mon,tue,wed}; typedef ennum day day; void main(void) { day d; d = sun; }​
כעת אני רוצה להדפיס את הערך של d אך לא רוצה לקבל 0 אלא sun. כיצד ניתן לעשות את זה ? אני יודע שאפשר לכתוב פונקציה שמקבלת ערך int ותחזיר את המחרוזת (בעזרת switch) אבל אני מחפש פתרון אלגנטי יותר
 

באפט

New member
אתה מתבלבל בין שמות למחרוזות

רשימת ה-enum היא רשימה של שמות של קבועים, לא רשימה של מחרוזות. כמו שהציעו כאן, אתה צריך להשתמש במערך של מחרוזות:
char *strings[] = {"sun", "mon", "whatever"};​
 

ihovav

New member
מה שהצעתי זה לא מחרוזת

אלא ליצור מבנה שמקשר בין מחרוזת ל ENUM ופונקציה ש "תדע" לקבל ENUM ולהחזיר מחרוזת
 
היית אומר

שדרך נוחה היא ליישם את זה באמצעות map (אם אתה עובד ב-++C). זו בעצם דרך יותר אלגנטית (ויעילה) לנהל מיפוי בין מספר למחרוזת, מאשר רשימה מקושרת. קרא על map ב-MSDN. באופל כללי, map הוא סוג של מילון. יש מפתח (במקרה שלך זהו מספר היום) וערך (המחרוזת המתאימה). למי שלא מכיר כ"כ את המחלקה הזו, אני מציע לעבוד אולי עם CMap של MFC. זה יותק פשוט ואולי חשוב יותר: זה מתועד באופן ברור יותר. בכל מקרה, אתה מאתחל את ה-Map בתחילת התוכנית, ואח"כ, הפונקציה שלך רק צריכה לבקש מה-map את המחרוזת המתאימה. משהו כזה:
enum day {sun,mon,tue}; typedef enum day day; typedef std::map<day,char*> MyMapType; static MyMapType MyMap; // helper for the Init() function: #define INITDAY(dayname) MyMap[dayname]=##dayname void Init() { INITDAY(sun); INITDAY(mon); INITDAY(tue); }; const char* GetDayName(day d) { MyMapType::const_iterator it = MyMap.find(d); // if not found: if (it == MyMap.end()) return NULL; return it->second; }​
כמו שאמרתי, במקום std::map אפשר לעבוד עם CMap והקוד יראה כמעט אותו הדבר...
 

באפט

New member
היישום לא מתאים ל-MAP

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