मैं दूसरे दिन स्टैक ओवरफ्लो पर इस उत्तर में आया और इस पर कुछ ध्यान देना चाहता था (जोर मेरा):
डिबगिंग के दौरान मुझे यह समस्या स्वयं प्रकट हुई थी जब मेरे पास एक घड़ी थी जिसने "लापता" कुंजी के आइटम को वापस करने का प्रयास किया था . वास्तव में, आगे निराश डिबगिंग में वही समस्या थी जब मेरे पास सचमुच [scriptingdictonaryObject].exists() condtional के लिए एक घड़ी थी; मेरा सुझाव है कि घड़ी की वजह से "गायब" कुंजी जोड़ी जाती है . जब मैंने घड़ी को हटा दिया और इसके बजाय चलने के दौरान सरणी को कॉपी करने के लिए एक अस्थायी वर्कशीट बनाई, तो अवांछित कुंजियाँ अब नहीं जोड़ी गईं।डिक्शनरी ऑब्जेक्ट जोड़ने से पहले आइटम जोड़ना () कहा जाता हैमैं एमएस स्क्रिप्टिंग रनटाइम लाइब्रेरी से एक डिक्शनरी ऑब्जेक्ट का उपयोग कर रहा हूं ताकि सरणी की एक श्रृंखला को स्टोर किया जा सके और आवश्यकतानुसार सरणी कोशिकाओं पर संचालन किया जा सके। प्रक्रियाओं के माध्यम से जाने के लिए लूप के लिए है ... Stack Overflowriddley_w
यहाँ क्या हो रहा है?
डिक्शनरी ऑब्जेक्ट की "फीचर्स" में से एक यह है कि यह निहित रूप से . होगा कॉल करने की आवश्यकता के बिना नए आइटम बनाएं। विधि जोड़ें स्पष्ट रूप से . निहित और स्पष्ट में क्या अंतर है?
नोट:डिक्शनरी ऑब्जेक्ट के प्रारंभिक-बाध्य उपयोग के लिए "माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम" (विवरण यहां) के संदर्भ की आवश्यकता है।
Dim MyDict As New Dictionary
'Explicit add
MyDict.Add "KeyA", "Item A"
'Implicit add
MyDict.Item("KeyB") = "Item B"
Debug.Print MyDict("KeyA"); vbNewLine; MyDict("KeyB")
अंतर्निहित . के संबंध में दस्तावेज़ीकरण का प्रासंगिक भाग यहां दिया गया है मुख्य निर्माण:
टिप्पणी
अगर कुंजी आइटम . बदलते समय नहीं मिला , एक नई कुंजी निर्दिष्ट newitem . के साथ बनाया गया है . अगर कुंजी किसी मौजूदा आइटम, एक नई कुंजी . को वापस करने का प्रयास करते समय नहीं मिला बनाया गया है और उसके संगत आइटम को खाली छोड़ दिया गया है।
समस्या का पुनरुत्पादन
आइए समस्या को पुन:पेश करते हैं यह देखने के लिए कि चीजें कहां जाती हैं।
अपेक्षित व्यवहार
निम्नलिखित नमूना दिनचर्या बनाएं:
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
उपरोक्त रूटीन को तत्काल विंडो से चलाएं और इसे वापस करना चाहिए False:
WatchOut
KeyA exists? False
घड़ी जोड़ें
अब, "कीए" आइटम की एक घड़ी जोड़ें:
आइए वॉचआउट . चलाने का प्रयास करें फिर से दिनचर्या:
WatchOut
KeyA exists? False
अब तक सब ठीक है. शायद यह कोई समस्या नहीं है।
कोड के माध्यम से कदम
आइए एक रोकें . जोड़ें कोड को तोड़ने के लिए बाध्य करने के लिए कथन:
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Stop
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
अब, आइए वॉचआउट . को चलाने का प्रयास करें दिनचर्या:
WatchOut
KeyA exists? True
आह! घड़ी का संयोजन और डिबगर में टूटना "बग" को प्रकट होने के लिए मजबूर करने के लिए पर्याप्त है। मैंने बग लगाया डरावने उद्धरणों में क्योंकि यह वास्तव में डीबगर के लिए अपेक्षित व्यवहार है। लेकिन यह लगभग निश्चित रूप से डेवलपर के लिए अप्रत्याशित व्यवहार है।
(ध्यान दें कि रोकें . के बारे में कुछ खास नहीं है आदेश जो इस व्यवहार का कारण बनता है। आप रोकें . को हटा सकते हैं लाइन और कोड पर ब्रेकपॉइंट सेट करें और वही व्यवहार होगा।)
आप देख सकते हैं कि डिबगिंग करते समय इस तरह की चीज़ आपके बालों को बाहर निकालने का कारण बन सकती है। जब भी आपके प्रोग्राम का व्यवहार सामान्य रूप से चलने के दौरान डिबगिंग के दौरान भिन्न होता है, तो आपको एक उत्तेजक डिबगिंग सत्र का लाभ मिलता है।
सारांश
समस्या को पुन:उत्पन्न करने के लिए कदम:
- एक विशिष्ट शब्दकोश आइटम के लिए एक घड़ी बनाएं
- कोड निष्पादित करते समय डीबगर में तोड़ दें
यह शायद केवल एक या दो डेवलपर्स की मदद करेगा। लेकिन यह संभावित रूप से उन डेवलपरों को घंटे बचाएगा हताशा का। और, अगर मैं ईमानदारी से कहूं, तो मेरे उन डेवलपर्स में से एक होने की भी संभावना है;-)।