मैं एक बड़ी गणना के साथ काम कर रहा हूं, जिसे चार अलग-अलग श्रेणियों का प्रतिनिधित्व करते हुए वैचारिक रूप से विभाजित किया जा सकता है। वर्तमान में मैं एक स्विच केस स्टेटमेंट में इस गणना का उपयोग चार अलग-अलग सरणियों (चार अलग-अलग श्रेणियों के अनुरूप) में मैप करने के लिए कर रहा हूं।

मैं उत्सुक हूं कि क्या स्विच केस स्टेटमेंट में मनमाने मामलों के बाद स्थानीय रूप से परिभाषित चर को बदलना संभव है। यह इन चार अलग-अलग वर्गों में स्विच स्टेटमेंट को तोड़ने की क्षमता के लिए अनुमति देगा, और मान असाइनमेंट जो प्रत्येक मामले के लिए होता है - यदि समकक्ष - इन वर्गों में हो सकता है।

एक सरल उदाहरण जो मैं जा रहा हूं वह इस प्रकार है:

सेटअप

enum incidental_indexes {
arr1_0, arr1_2, arr2_0, arr1_1, arr2_1
} indexes;

struct foobar{ 
int arr1[3];
int arr2[2];
}

enum indexes unknown_index = ???; // In my code there are two separate indexes being mapped 
                               // from one another, so for the sake of example imagine that 
                               // this index is unknown
enum indexes curr_index = arr1_1;   //Value here does not matter
struct foobar my_struc;
int * curr_arr;
int mapped_index;

जानवर बल दृष्टिकोण

switch(unknown_index){
 case(arr1_0):
    curr_arr = my_struc.arr_1; //First category array
    curr_index = arr1_0;
    break;
 case(arr1_1):
    curr_arr = my_struc.arr_1; //First category array, again
    curr_index = arr1_1;
    break;
 case(arr1_2):
    curr_arr = my_struc.arr_1; //First category array, again, again
    curr_index = arr1_2;
    break;
 case(arr2_0):
    curr_index = arr2_0;
    curr_arr = my_struc.arr_2;  //Second category array
    break;
 case(arr2_1):
    curr_index = arr2_1;
    curr_arr = my_struc.arr_2;  //....
    break;
}

आदर्श दृष्टिकोण

switch(unknown_index){
 default:   //Notice no break.
    curr_arr = my_struc.arr_1; //First category array
 case(arr1_0):
    curr_index = arr1_0;
    break;
 case(arr1_1):
    curr_index = arr1_1;
    break;
 case(arr1_2):
    curr_index = arr1_2;
    break;
 default: //Something like a second default, however disallowed 
    curr_arr = my_struc.arr_2;  //Second category array
 case(arr2_0):
    curr_index = arr2_0;
    break;
 case(arr2_1):
    curr_index = arr2_1;
    break;
}

कार्यात्मक लाभ स्पष्ट रूप से शून्य हैं, हालांकि मैं उत्सुक हूं कि अगर यह कार्यक्षमता सी में भी मौजूद है, या यदि इसे निष्पादित करने के लिए एक बेहतर तरीका है।

धन्यवाद!

1
TolkienWASP 21 नवम्बर 2015, 00:53

3 जवाब

सबसे बढ़िया उत्तर

स्विच स्टेटमेंट केवल एक ही ब्रांच का प्रदर्शन करते हैं, इसलिए आप स्विच के अंदर इधर-उधर नहीं जा सकते। हालाँकि आप एक break बिना कुछ मामलों को एक साथ समूह में कर सकते हैं:

switch(curr_index){
 case arr1_0:
 case arr1_1:
 case arr1_2:
    curr_arr = my_struc.arr_1;
    break;
 case arr2_0:
 case arr2_1:
    curr_arr = my_struc.arr_2;
    break;
}

संपादित करें:

सूचकांक असाइनमेंट भाग के लिए, आप इस तरह से एक दूसरा switch कर सकते हैं:

switch(unknown_index){
 case arr1_0:
    curr_index = arr1_0;
    break;
 case arr1_1:
    curr_index = arr1_1;
    break;
 case arr1_2:
    curr_index = arr1_2;
    break;
 case arr2_0:
    curr_index = arr2_0;
    break;
 case arr2_1:
    curr_index = arr2_1;
    break;
}

लेकिन जब से आप हमेशा unknown_index का मान असाइन कर रहे हैं, उपरोक्त इस प्रकार है:

curr_index = unknown_index;
3
dbush 21 नवम्बर 2015, 02:05

एक स्विच के भीतर आपके पास सभी स्थानीय रूप से परिभाषित चर तक पहुंच है। मुझे यकीन नहीं है कि मैं आपके प्रश्न को समझ पा रहा हूं ... ऐसा लगता है कि आप जो करने की कोशिश कर रहे हैं वह 2 स्विच द्वारा पूरा किया गया है:

switch(unknown_index){
 case(arr1_0):
 case(arr1_1):
 case(arr1_2):
    curr_arr = my_struc.arr_1; //First category array, again, again
    break;
 case(arr2_0):
 case(arr2_1):
    curr_arr = my_struc.arr_2;  //....
    break;
}
switch(unknown_index){
 case(arr1_0):
    curr_index = arr1_0;
    break;
 case(arr1_1):
    curr_index = arr1_1;
    break;
 case(arr1_2):
    curr_index = arr1_2;
    break;
 case(arr2_0):
    curr_index = arr2_0;
    break;
 case(arr2_1):
    curr_index = arr2_1;
    break;
}
0
James Whong 20 नवम्बर 2015, 23:09

एक, नहीं।

दो, सिर्फ ifs और elses का उपयोग करें। जैसा कि कहावत है, जब आपके पास एक हथौड़ा होता है, तो सब कुछ एक नाखून की तरह दिखता है। switch सब कुछ लागू करने की कोशिश करने के लिए एक बहुत अजीब "हथौड़ा" है।

तीन, उम, मुझे लगता है कि आप goto का उपयोग हर जगह कर सकते हैं, लेकिन हमने तय किया कि यह एक बुरा विचार है और 80 या कुछ में कोड के भयानक रूप से गड़बड़ करता है।

1
djechlin 20 नवम्बर 2015, 22:03