2013-07-27 9 views
16

मुझे वीएस 2012 में अजीब व्यवहार का सामना करना पड़ता है (मैं सीपीपी में लिख रहा हूं)।घड़ी देखें अपरिभाषित पहचानकर्ता दृश्य स्टूडियो 2012, सीपीपी

मैं एक चर पर "घड़ी जोड़ें" पर क्लिक करता हूं और यह कहता है "पहचानकर्ता अनिर्धारित है"।

यहाँ कोड का एक उदाहरण है:

for (int j=0;j<32;j++) 
     { 
      unsigned char curValue=desc1.at<unsigned char>(0,j); 
      printf("%s\n",curValue);  
     } 

मैं printf का उपयोग करने के लिए curValue का मूल्य दिखाने के लिए किया था। जबरदस्त हंसी।

क्या किसी को इस तरह का व्यवहार सामना करना पड़ा है?

संपादित करें: यह और अधिक अजीब होता है। निम्नलिखित कोड डीबग करते समय:

int b1[8]; 

    for (int k=0;k<7;k++) 
     b1[k]=0; 

    char q=curValue; 
    int t=0; 
    while (q!=0){ 
     b1[t++]=q%2; 
     q=q/2; 
    } 

डीबगर बस बी 1 [के] = 0 के साथ लूप को छोड़ देता है;

कृपया ध्यान दें कि लूप के अंदर भी curvalue अपरिभाषित है।

धन्यवाद!

+0

समस्या के लिए एक और समाधान संकलक सक्षम की अनुकूलन छोड़ देते हैं, लेकिन अतिरिक्त डिबगिंग जानकारी है कि अनुकूलित कोड के साथ काम उत्पन्न करने के लिए/Zo (अनुकूलित डिबगिंग बेहतर बनाएँ) संकलक बता सक्षम बनाना है। यह केवल विजुअल स्टूडियो 2013 अपडेट 3 या बाद के संस्करण के लिए उपलब्ध है। https://msdn.microsoft.com/en-us/library/dn785163.aspx –

उत्तर

22

जैसा कि जोआचिम ने कहा: लूप के अंदर curValue परिभाषित किया गया है। यदि दृश्य स्टूडियो में विंडो देखें तो इसे अपरिभाषित मान के रूप में देखें, तो आपको कंपाइलर अनुकूलन बंद करना चाहिए।

कंपाइलर अनुकूलन डिफ़ॉल्ट/O2 गति के लिए अनुकूलित है। करने के लिए> अनुकूलन

  • चयन अनुकूलन, और अधिकतम गति से इसे बदल (/ O2) - परियोजना के लिए

    • जाओ, राइट क्लिक करें और गुण
    • विन्यास गुण> C/C++ चुनें: इसे बंद करने अक्षम (/ ओवर ड्राफ्ट) enter image description here
  • +2

    ध्यान दें कि यह मुख्य रूप से डीबग कॉन्फ़िगरेशन मोड के लिए उपयोग किया जाता है, जो रिलीज़ करने के लिए उपयुक्त नहीं है जो कि बग-फ्री और अनुकूलित दोनों होना चाहिए। धन्यवाद। –

    1

    याद रखें कि परिवर्तनीय curValue केवल लूप के अंदर मान्य है, अगर आप इसे लूप में नहीं देखते हैं तो घड़ी को जोड़ने का प्रयास करते हैं तो चर परिभाषित नहीं किया जाता है।

    +0

    उत्तर के लिए धन्यवाद, लेकिन यह लूप के अंदर भी अपरिभाषित है। – GilLevi

    +3

    @ user2215359 क्या आप अनुकूलन चालू कर चुके हैं? डिबगिंग करते समय वे गड़बड़ कर सकते हैं। और इस मामले में, यदि लूप में 'curValue' के असाइनमेंट से अधिक नहीं है, तो संभवतः * ऑप्टिमाइज़ किया जाएगा। –

    +1

    उत्तर के लिए धन्यवाद। मैं कैसे जांचूं कि मेरे पास अनुकूलन चालू है या नहीं? – GilLevi

    1

    क्योंकि curValuefor लूप के बाहर दायरे से बाहर हो जाता है।

    यह भी ध्यान दें कि प्रिंट करने के लिए आपको printf में %c का उपयोग करना चाहिए। %s सी-शैली तारों के लिए उपयोग किया जाता है।

    printf("%c\n",curValue); 
    
    1

    परिवर्तनीय curValue केवल लूप के अंदर मान्य है। यदि आप लूप में नहीं होने पर इसे "घड़ी" में जोड़ने का प्रयास करेंगे, तो आपका चर परिभाषित नहीं किया जाएगा।

    नोट: इसके बजाय इस बात का

    printf("%c\n",curValue); 
    

    :: बेहतर आप इस प्रिंट चाहिए

    printf("%s\n",curValue) 
    
    4

    मैं था अनुकूलन पर बदल गया। यह मेरी डीबगिंग गड़बड़ कर दिया।

    2

    प्रिंटफ के बिना, पहले लूप का कोई साइड इफेक्ट नहीं होता है और इस प्रकार इसे अनुकूलित निर्माण में अनुकूलित किया जाता है। दूसरे उदाहरण में, लूप जो छोटे सरणी को 0 तक प्रारंभ करता है, शायद प्रारंभिक डेटा अनुभाग के साथ प्रतिस्थापित किया जाता है।

    आपको शायद एक अप्रत्याशित निर्माण के साथ डीबग करने का प्रयास करना चाहिए।

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

    +0

    उत्तर देने वाले सभी के लिए धन्यवाद। – GilLevi

    संबंधित मुद्दे