C++ switch

הדג

New member
C++ switch

אהלן, האם מישהו מכיר שיטה כלשהי להשתמש ב switch על מחרוזות ב c++? הכוונה היא כמובן ל *char (או *const char), ולא דרך if else.. תודה.
 

DNile

New member
אין אפשרות כזאת.

switch מוגדר לעבוד רק על ערכים מספריים.
 

mag net

New member
../images/Emo5.gif פתרון דחוק

אם מספיק לך לבדוק רק סימן אחד מהמחרוזת נניח הסימן הראשון תוכל להפוך אותו ל char ולבדוק אותו ב - switch.
 

הדג

New member
לא מספיק

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

berdim99

New member
אפשר עם union

תנסה את זה - תגדיר union של char[4] ו-int. תשתמש ב-string של 4 תווים, ואז תעשה switch על החלק ה-int של ה-union. (מקווה שאני מובן...)
 
וזה גם מגעיל להשתמש ב UNION

רק מהנדסים משתמשים בזה...
 

galh

New member
אתה טועה.

קודם כל, char הוא ערך מספרי ב- 127- ל- 128.דבר שני, אם תנסה לשים ב- switch מקרים של מחרוזות (שבהחלט ידועות בזמן קומפילציה) תקבל הודעה שגיאה בסגנון של: error C2450: switch expression of type 'const char *' is illegal.
 
char* לא.

char כן. לכן, אין בעיה לעבור על char* בלולאה. ולא התכוונתי לערך המספרי של char, התכוונתי ממש :
case 'R' :​
 

galh

New member
זה ערך מספרי.

לרשום 'R' או 82 או 0x52 זה בדיוק אותו דבר, רק יותר ברור למתכנת.
 

הדג

New member
זו בדיוק בהעיה

שאין דרך אחרת לבצע את זה פרט ל strcmp (עם הרבה תנאים)
 
אין. אבל...........

תוכל לנסות לממש לעצמך עם מקרו למשל.
STR_SWITCH(str) } STR_CASE(hello) { do_this(); } STR_CASE(world) { do_that(); } STR_DEFAULT { do_default(); }​
זה רק בשביל התרגיל. אם תכתוב קוד כזה במסגרת יותר מחייבת מאשר לימודים, עלולים לירות בך
 

gmorphus

New member
הנה

או משהו קצת יותר יפה: (בלי fall through)
#include <iostream> #include <string> using namespace std; #define SWITCH(x, _type) { \ _type *_in_switch_ptr = &(x); \ if (0) ; #define CASE0(x) else if ((*_in_switch_ptr) == (x)) { #define CASE(x) } else if ((*_in_switch_ptr) == (x)) { #define DEFAULT } else { #define END_SWITCH }}; int main() { string str = "bla31"; SWITCH(str, string) CASE0("bla1") cout << "case 1\n"; CASE("bla2") cout << "case 2\n"; DEFAULT cout << "default\n"; END_SWITCH return 0; }​
 

erezsh

New member
אין, אבל

אתה יכול להשתמש ב-Checksums או Hashes כדי להפוך את המחרוזות לייצוג מספרי, ואז להשתמש בהם ב-switch. אבל עדיין מומלץ להשוות את המחרוזות, רק למקרה ש..
 

mag net

New member
פתרון נוסף

פשוט להגדיר את המחרוזת כמשאב. ואז לכל מחרוזת יש מספר ולבצע את ה switch על ה ID של המשאב שהוא כמובן מספר. למשל
#define IDS_HELLO 1 #define IDS_GOODBYE 2 STRINGTABLE { IDS_HELLO, "Hello" IDS_GOODBYE, "Goodbye" }​
מקווה שזה מובן
 
למעלה