मेटाट्रेडर 4 - उदाहरण MQL4 कार्यक्रमों में आम त्रुटियां और उन्हें कैसे से बचने के लिए परिचय कुछ पुराने प्रोग्राम संकलक के MQL4 के नए संस्करण में त्रुटियों को वापस कर सकते हैं। कार्यक्रमों की महत्वपूर्ण समाप्ति से बचने के लिए, पिछले संस्करण कंपाइलर ने रनटाइम पर्यावरण में कई त्रुटियों को संभाला। उदाहरण के लिए, शून्य या श्रेणी से बाहर सरणी विभाजन महत्वपूर्ण त्रुटियों हैं और आम तौर पर आवेदन दुर्घटना का कारण बनता है। ऐसी त्रुटियां चर के कुछ मूल्यों के लिए कुछ राज्यों में ही होती हैं। ऐसे मामलों को कैसे संभालना है यह जानने के लिए इस लेख को पढ़ें नया कंपाइलर त्रुटियों के वास्तविक या संभावित स्रोतों का पता लगा सकता है और कोड गुणवत्ता सुधार सकता है। इस लेख में, हम संभावित त्रुटियों की चर्चा करते हैं जिन्हें पुराने कार्यक्रमों के संकलन के दौरान पता लगाया जा सकता है और उन्हें ठीक करने के तरीके। 1 संकलन त्रुटियाँ यदि एक प्रोग्राम कोड में त्रुटियाँ हैं इसे संकलित नहीं किया जा सकता। सभी त्रुटियों को पूरी तरह से नियंत्रित करने के लिए, सख्त संकलन मोड का उपयोग करने की सिफारिश की गई है। जो निम्न निर्देश द्वारा निर्धारित किया गया है: इस मोड में समस्या निवारण आसान है। 1.1। आइडेंटिफ़ायर आरक्षित शब्द के साथ मेल खाता है यदि एक चर या फ़ंक्शन का नाम आरक्षित शब्दों में से एक के साथ मेल खाता है तो कंपाइलर एक त्रुटि संदेश देता है: चित्रा 1। अनपेक्षित टोकन और नाम अपेक्षित त्रुटियाँ इस त्रुटि को ठीक करने के लिए, आपको सही नाम का उपयोग करने की आवश्यकता है चर या फ़ंक्शन 1.2। वेरिएबल्स और फ़ंक्शंस के नामों में विशेष वर्ण यदि वेरिएबल्स या फंक्शन के नाम में विशेष वर्ण (,, बिंदु) होते हैं: कंपाइलर एक त्रुटि संदेश देता है: चित्रा 2. अज्ञात अज्ञात प्रतीक और अर्धविराम की त्रुटियाँ इस त्रुटि को ठीक करने के लिए, आपको सही उपयोग करने की आवश्यकता है फ़ंक्शन या चर नाम 1.3। स्विच ऑपरेटर का उपयोग करने वाले त्रुटियाँ संकलक के पुराने संस्करण में आप अभिव्यक्तियों और स्विच ऑपरेटर के स्थिरांकों में किसी भी मूल्य का उपयोग कर सकते हैं: नए कंपाइलर में, स्विच ऑपरेटर की स्थिरांक और भाव पूर्णांक होना चाहिए, इसलिए त्रुटियों तब होती हैं जब आप उपयोग करने का प्रयास करते हैं इस तरह के निर्माण: चित्रा 3. त्रुटियाँ अवैध स्विच अभिव्यक्ति प्रकार और निरंतर अभिव्यक्ति अभिन्न नहीं है ऐसे मामलों में, आप संख्यात्मक मानों की स्पष्ट तुलना का उपयोग कर सकते हैं, उदाहरण के लिए: 1.4। फ़ंक्शन के मूल्य लौटें शून्य से छोड़कर सभी फ़ंक्शन घोषित प्रकार मान वापस करना चाहिए। उदाहरण के लिए: सख्त संकलन मोड में एक त्रुटि आती है: चित्रा 4। त्रुटि सभी नियंत्रण पथ मान वापस नहीं करते डिफ़ॉल्ट संकलन मोड में, संकलक एक चेतावनी देता है: चित्रा 5. सावधान नहीं सभी नियंत्रण पथ एक मान वापस अगर वापसी मूल्य का घोषित घोषित समारोह से मेल नहीं खाता: सख्त संकलन के दौरान एक त्रुटि का पता लगाया गया है: चित्रा 6। त्रुटि फ़ंक्शन को एक मान वापस करना होगा डिफ़ॉल्ट संकलन मोड में, कंपाइलर एक चेतावनी देता है: चित्रा 7. चेतावनी वापसी - फ़ंक्शन को एक मान वापस करना होगा त्रुटियों, कार्य कोड को संबंधित प्रकार के रिटर्न मूल्य के साथ रिटर्न ऑपरेटर जोड़ें। 1.5। फ़ंक्शन तर्कों में एरे फ़ंक्शन तर्क में, सरणियों को केवल संदर्भ से ही पारित किया जाता है सख्त संकलन मोड में, यह कोड एक त्रुटि का कारण होगा: चित्र 8. संकलक त्रुटि सरणी संदर्भ द्वारा पारित केवल डिफ़ॉल्ट संकलन मोड में, संकलक एक चेतावनी देता है: चित्रा 9। संकलक चेतावनी केवल संदर्भ से पारित arrays इस त्रुटि को ठीक करने के लिए, आपको चाहिए स्पष्ट रूप से निर्दिष्ट करें कि सरणी को सरणी के नाम से पहले उपसर्ग amp जोड़कर संदर्भ से पारित किया गया है: यह ध्यान दिया जाना चाहिए कि अब निरंतर arrays (समय। ओपन। उच्च। कम बंद करें। वॉल्यूम) संदर्भ द्वारा पारित नहीं किया जा सकता है। उदाहरण के लिए, निम्न कॉल: संकलन मोड की परवाह किए बिना एक त्रुटि की ओर जाता है: चित्रा 10. त्रुटि ओपन - निरंतर चर संदर्भ के रूप में पारित नहीं किया जा सकता इन त्रुटियों से बचने के लिए, निरंतर सरणी से आवश्यक डेटा की प्रतिलिपि बनाएँ: 2. रनटाइम त्रुटियां त्रुटियाँ कार्यक्रम कोड के निष्पादन के दौरान होते हैं, जिन्हें रनटाइम त्रुटियां कहा जाता है ऐसी त्रुटियां आम तौर पर किसी प्रोग्राम की स्थिति पर निर्भर करती हैं और चर के गलत मानों से जुड़ी हैं। उदाहरण के लिए, यदि कोई वैरिएबल सरणी तत्वों की एक अनुक्रमणिका के रूप में उपयोग किया जाता है, तो उसके नकारात्मक मान अनिवार्य रूप से रेंज त्रुटि से बाहर निकल जाएगा। 2.1। रेंज से बाहर सरणी यह संकेत सूचक बफ़र्स तक पहुंचने में अक्सर होता है। सूचक सूचक () फ़ंक्शन अंतिम सूचक कॉल के बाद से अपरिवर्तित बार की संख्या देता है। पहले की गणना वाले सलाखों के सूचक संकेतों को पुनर्गणना की आवश्यकता नहीं है, इसलिए तेज़ी से गणना के लिए आपको केवल पिछले कुछ सलाखों को संसाधित करने की ज़रूरत है गणना सूचकांक की इस पद्धति का उपयोग करने वाले अधिकांश संकेतक इस तरह दिखते हैं: अक्सर गिनती के मामले में ग़लत ढंग से संभाला जाता है (प्रारंभिक सीमा स्थिति को लूप चर के अनुसार 1 अधिकतम सूचकांक के बराबर मूल्य से कम किया जाना चाहिए)। इसके अलावा, याद रखें कि प्रारंभ () फ़ंक्शन निष्पादन के समय हम 0 से बार (-1) सूचक सूचक बफ़र्स के तत्वों का उपयोग कर सकते हैं यदि आपको सरणियों के साथ काम करने की आवश्यकता है जो संकेतक बफ़र्स नहीं हैं, तो सूचक बफर के मौजूदा आकार के अनुसार अरायराइज़ () फ़ंक्शन का उपयोग करके उनका आकार बढ़ाएं पता करने के लिए तत्व का अधिकतम सूचक भी एक तर्क के रूप में इस्तेमाल किए जाने वाले एक सूचक बफ़र के साथ ArraySize () को कॉल करके प्राप्त किया जा सकता है। शून्य विभाजित त्रुटि तब होती है जब विभाजन के भाग में एक विभाजक शून्य के बराबर होता है: जब आप इस स्क्रिप्ट को चलाते हैं, विशेषज्ञ टैब में एक त्रुटि संदेश दिखाई देता है और प्रोग्राम बंद हो जाता है: आकृति 11. त्रुटि संदेश शून्य विभाजन आमतौर पर यह त्रुटि तब होती है जब भाजक के मूल्य को किसी भी बाह्य डेटा के मूल्यों से निर्धारित किया जाता है। उदाहरण के लिए, यदि व्यापार पैरामीटर का विश्लेषण किया जाता है, तो उपयोग किए गए मार्जिन का मान 0 के बराबर होता है यदि कोई खुले आदेश नहीं हैं। एक अन्य उदाहरण: यदि फ़ाइल का विश्लेषण डेटा पढ़ा जाता है, तो हम सही संचालन की गारंटी नहीं दे सकते हैं अगर फाइल उपलब्ध नहीं है। तो आपको ऐसे मामलों को ध्यान में रखना चाहिए और उन्हें सही ढंग से क्रियान्वित करना चाहिए। विभाजन का संचालन करने से पहले विभाजक को जांचना और गलत पैरामीटर मान की रिपोर्ट करना है: यह एक गंभीर त्रुटि का कारण नहीं है, लेकिन गलत पैरामीटर मान के बारे में एक संदेश प्रकट होता है और प्रोग्राम बंद हो जाता है: चित्रा 12. गलत विभाजक संदेश 2.3। वर्तमान चरित्र के लिए शून्य के बजाय 0 का उपयोग संकलक 0 (शून्य) के पुराने संस्करण में फ़ंक्शन के रूप में एक तर्क के रूप में इस्तेमाल किया जा सकता है जिसमें वित्तीय साधन की आवश्यकता होती है। उदाहरण के लिए, वर्तमान प्रतीक के लिए स्थानांतरण औसत तकनीकी संकेतक का मान निम्न प्रकार से अनुरोध किया जा सकता है: नए कंपाइलर में आपको वर्तमान प्रतीक को निर्दिष्ट करने के लिए स्पष्ट रूप से निर्दिष्ट करना चाहिए: इसके अतिरिक्त, मौजूदा प्रतीक और चार्ट अवधि का उपयोग करके निर्दिष्ट किया जा सकता है प्रतीक () और अवधि () कार्य 2.4। यूनिकोड स्ट्रिंग्स और उनका इस्तेमाल डीएलएल स्ट्रिंग्स में अब यूनिकोड वर्णों के अनुक्रम के रूप में किया जाता है। यह याद रखें और उपयुक्त Windows फ़ंक्शन का उपयोग करें। उदाहरण के लिए, जब आप InternetOpenA () और InternetOpenUrlA () के बजाय wininet. dll लायब्रेरी का उपयोग करते हैं, तो आपको InternetOpenW () और InternetOpenUrlW () को कॉल करना चाहिए। तार की आंतरिक संरचना MQL4 में बदल गई है (अब इसे 12 बाइट्स लेते हैं), और MLL स्ट्रिंग संरचना का उपयोग डीएलएल को स्ट्रिंग करते समय किया जाना चाहिए: 2.5। फ़ाइल साझा करना फाइलों को खोलते समय नए MQL4 में, FILESHAREWRITE और FILESHAREREAD झंडे को साझा उपयोग के लिए स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए यदि झंडे अनुपस्थित हैं, तो फ़ाइल अनन्य मोड में खोला जा सकती है और इसे किसी अन्य द्वारा खोला नहीं जा सकता है जब तक यह उपयोगकर्ता द्वारा खोला नहीं गया है। उदाहरण के लिए, ऑफ़लाइन चार्ट शेयर झंडे के साथ काम करते समय स्पष्ट रूप से निर्दिष्ट होना चाहिए: 2.6। एक स्ट्रिंग के लिए डेटटाइम का डेटटाइम रूपांतरण रूपांतरण अब संकलन मोड पर निर्भर करता है: उदाहरण के लिए, उन फाइलों के साथ काम करने की कोशिश कर रहे हैं जिनके नाम में एक बृहदान्त्र है, एक त्रुटि उत्पन्न करता है। 3. कंपाइलर चेतावनी कंपाइलर चेतावनी जानकारीपूर्ण है और त्रुटि संदेश नहीं हैं। लेकिन वे संभावित त्रुटि स्रोतों का संकेत देते हैं एक स्पष्ट कोड में चेतावनियां नहीं होनी चाहिए। 3.1। वैश्विक और स्थानीय स्तर के नामों की गणना यदि वैश्विक और स्थानीय स्तरों पर भिन्नताएं समान नाम हैं: कंपाइलर एक चेतावनी दिखाता है, जिस पर वैश्विक चर घोषित किया गया है, लाइन नंबर दिखा रहा है: चित्रा 13। चेतावनी घोषित करने के लिए लाइन पर वैश्विक घोषणा लपेटें चेतावनी वैश्विक चर के सही नाम 3.2। प्रकारों का बेमेल नया कंपाइलर का एक नया टाइपकास्टिंग ऑपरेशन है। सख्त संकलन मोड में कंपाइलर चेतावनियाँ दिखाता है कि अगर प्रकार बेमेल: चित्रा 14. प्रकार रूपांतरण और संख्या से स्ट्रिंग में असंतुलित रूपांतरण के कारण डेटा की संभव हानि। इस उदाहरण में, संकलक निर्दिष्ट किए गए विभिन्न डेटा प्रकारों के लिए सटीकता की संभावित हानि के बारे में चेतावनी देता है इंट से स्ट्रिंग तक अंतर्निहित रूपांतरण चेतावनी का प्रयोग स्पष्ट प्रकार कास्टिंग ठीक करने के लिए: 3.3। अप्रयुक्त चर प्रोग्राम कोड (अति आवश्यक संस्थाओं) में उपयोग नहीं किए जाने वाले चर की उपस्थिति एक अच्छी आदत नहीं है। संकलन मोड की परवाह किए बिना ऐसे चर की रिपोर्ट प्रदर्शित की जाती है: चित्रा 15. चेतावनी चर का उपयोग नहीं किया गया, इसे ठीक करने के लिए, अपने कोड से अप्रयुक्त चर को हटा दें। निष्कर्ष लेख सामान्य समस्याओं का वर्णन करता है जो त्रुटियों वाले पुराने कार्यक्रमों के संकलन के दौरान हो सकते हैं। सभी मामलों में यह कार्यक्रम डिबगिंग के लिए कड़ी संकलन मोड का उपयोग करने के लिए अनुशंसित है। चेतावनी: इन सामग्रियों के सभी अधिकार MQL5 लिमिटेड द्वारा आरक्षित हैं। इन सामग्रियों को संपूर्ण या आंशिक रूप से प्रतिलिपि बनाने या पुन: मुद्रित करना निषिद्ध है। सरणियों के साथ काम करने में मदद की ज़रूरत है - एमटी 4 मैं टोकरी व्यापार ईए पर काम कर रहा हूं। अब तक मैंने ज्यादातर कोड लिखे हैं और मैं टोक्यो में खरीदा और बटंस फ़ंक्शन को बेच दिया। मेरे पास अब तक बटन बनाने और आवश्यक मानों के साथ कई सूत्रों को खाने के लिए कई सरणी हैं। अब मेरे पास निम्न हैं: शेष जोड़े के लिए सही टोकरी बनाने के लिए और अलग-अलग चिह्नों के साथ अधिक सरणी। OnChartEvent खंड में, मैं निम्न संभव होना चाहता हूँ: objsymiDoubleToString (i4), 0) बटन के सही संप्रदाय से मिलान करने के लिए - इस मामले में अधिक महत्व का नहीं। अगर (sparam) obj बटन को ऑर्डर्सेंड (EURUSDbr।) दबाया गया है, तो यह वह जगह है जहाँ मुझे समस्या है I0, sym0EURUSD के पाश के पहले भाग में - मैं अगले फ़ंक्शन में कॉल करने के लिए सरणी नाम का निर्माण कर सकता हूं: sym0quotbquot। सही सरणी को कॉल करने के लिए (sym0quotbquot) परिणाम का उपयोग कैसे करें, इस मामले में: EURUSDbr मैंने EURUSDbr के बराबर प्राप्त करने के लिए (symiquotbquot) आर की कोशिश की लेकिन काम नहीं किया। ObjectSetString (। OBJPROPSTATE, झूठी) मुझे पता है कि अगर लूप ऑर्डेंड फ़ंक्शन में इस्तेमाल करने के लिए मैन्युअल रूप से सरणी प्रदान करने के साथ और बाकी की सरणी सूची में 2 आयाम सरणी जोड़ सकता है। मैं अतिरिक्त लाइन या कोई अतिरिक्त सरणियों को बनाना नहीं चाहता - शेष कोड पहले से ही मौजूदा एरे के चारों ओर बनाए गए हैं और वास्तव में यह सुनिश्चित करने से पहले पूरे कोड को फिर से लिखना नहीं चाहेंगे कि मैं उसके बाद क्या हासिल कर सकता हूं। अगर किसी भी कार्य को मैंने जो ऊपर बताया है, करने के लिए मौजूद है (उम्मीद है कि मैंने इसे पर्याप्त रूप से समझाया है), कृपया मुझे इस तरह से या किसी अन्य सरल कार्यवाही को इस मामले में दिखाएं। तुम्हारी मदद के लिए शुक्रिया।
Comments
Post a Comment