मुझे सी ++ में गोटो स्टेटमेंट के उपयोग के बारे में कोई प्रश्न है। मैं समझता हूं कि यह विषय विवादास्पद है, और मुझे किसी भी व्यापक सलाह या तर्क में रूचि नहीं है (मैं आमतौर पर goto
का उपयोग करने से भटक जाता हूं)। इसके बजाय, मेरे पास एक विशिष्ट स्थिति है और यह समझना है कि मेरा समाधान, जो गोटो स्टेटमेंट का उपयोग करता है, एक अच्छा है या नहीं। मैं खुद को सी ++ में नया नहीं कहूंगा, लेकिन खुद को पेशेवर स्तर के प्रोग्रामर के रूप में वर्गीकृत नहीं करूंगा। एक बार शुरू होने वाले कोड का हिस्सा एक बार अनंत लूप में मेरा प्रश्न स्पिन उत्पन्न कर चुका है।लूप को साफ़ करने के लिए गोटो का उपयोग
void ControlLoop::main_loop()
{
InitializeAndCheckHardware(pHardware) //pHardware is a pointer given from outside
//The main loop
while (m_bIsRunning)
{
simulated_time += time_increment; //this will probably be += 0.001 seconds
ReadSensorData();
if (data_is_bad) {
m_bIsRunning = false;
goto loop_end;
}
ApplyFilterToData();
ComputeControllerOutput();
SendOutputToHardware();
ProcessPendingEvents();
while (GetWallClockTime() < simulated_time) {}
if (end_condition_is_satisified) m_bIsRunning = false;
}
loop_end:
DeInitializeHardware(pHardware);
}
pHardware सूचक ControlLoop वस्तु बाहर से पारित कर दिया है और एक बहुरूपी प्रकार है, तो यह बहुत मतलब नहीं है मुझे का उपयोग करने के लिए: इस प्रकार स्यूडोकोड में धागे के सामान्य प्रवाह है RAII और main_loop के अंदर हार्डवेयर इंटरफ़ेस को स्वयं बनाने और नष्ट करने के लिए। मुझे लगता है कि मैं pHardware हार्डवेयर के "सत्र" या "उपयोग" का प्रतिनिधित्व करने वाली एक अस्थायी वस्तु बना सकता हूं जिसे मुख्य_लोप से बाहर निकलने पर स्वचालित रूप से साफ़ किया जा सकता है, लेकिन मुझे यकीन नहीं है कि वह विचार किसी को स्पष्ट करेगा और मेरा इरादा क्या है। लूप से केवल तीन तरीके ही होंगे: पहला यह है कि बाहरी हार्डवेयर से खराब डेटा पढ़ा जाता है; दूसरा यह है कि यदि ProcessPendingEvents() उपयोगकर्ता द्वारा शुरू की गई गर्भपात इंगित करता है, जो केवल m_bIs को झूठी बनने का कारण बनता है; और अंतिम यह है कि अंतराल लूप के नीचे संतुष्ट है। मुझे यह भी ध्यान रखना चाहिए कि main_loop को ControlLoop ऑब्जेक्ट के जीवन में कई बार शुरू किया जा सकता है और इसे समाप्त कर दिया जा सकता है, इसलिए इसे m_bIsRunning = false
के बाद साफ से बाहर निकलना चाहिए।
इसके अलावा, मुझे एहसास है कि मैं यहां ब्रेक कीवर्ड का उपयोग कर सकता हूं, लेकिन इनमें से अधिकांश छद्म कोड फ़ंक्शन मुख्य_लोप के अंदर कॉल वास्तव में कार्यों के रूप में encapsulated नहीं हैं, क्योंकि केवल उन्हें कई तर्क हैं या उन्हें सभी को पहुंच की आवश्यकता होगी सदस्य चर मुख्य रूप से main_loop को लंबे समय तक फ़ंक्शन के रूप में छोड़ने के बजाय, इन दोनों मामलों में अधिक भ्रमित हो जाएगा, और बड़े समय की लूप की लंबाई के कारण, goto loop_end
जैसे एक बयान मुझे स्पष्ट रूप से पढ़ना प्रतीत होता है।
अब प्रश्न के लिए: क्या यह समाधान आपको अपने कोड में लिखने के लिए असहज बनाता है? यह मेरे लिए थोड़ा गलत महसूस करता है, लेकिन फिर मैंने सी ++ कोड में पहले गोटो स्टेटमेंट का उपयोग नहीं किया है - इसलिए विशेषज्ञों की मदद के लिए मेरा अनुरोध। क्या कोई अन्य बुनियादी विचार है जो मुझे याद आ रहा है जो इस कोड को स्पष्ट कर देगा?
धन्यवाद।
"यह मेरे लिए आरएआईआई का उपयोग करने के लिए ज्यादा समझ में नहीं आता है" यह हमेशा आरएआईआई का उपयोग करने के लिए समझ में आता है। हमेशा। समय के सभी। –
यहां 'ब्रेक' का उपयोग क्यों न करें? –
यदि आप केवल एक लूप है जिसे आप तोड़ रहे हैं, तो 'ब्रेक' का उपयोग करें; यह क्लीनर और स्पष्ट है। यदि आपके पास लूपिंग के कई स्तर हैं, या यदि आप 'स्विच' के अंदर हैं, और आपको सभी लूप से बाहर निकलने की आवश्यकता है, तो 'गोटो' ठीक है। –