2009-02-04 6 views
5

मेरे संकलक (वीसी ++ 6.0 SP6) में झूठी कीवर्ड जाहिरा तौर पर पागल हो गया है। कोड के कुछ हिस्सों में मैं देख रहा हूं कि 'bool mybool = true;' झूठ बोलता है और गलत करता है, और इसके विपरीत इसके विपरीत। सच/झूठे कीवर्ड को 1/0 पर बदलना यह ठीक काम करता है। एक ही कोड सही/गलत कीवर्ड को बदले बिना कहीं और ठीक करता है।सी ++ 'सही' और 'गलत' अचानक सच नहीं या विजुअल C++ 6.0

संभवतः इसका कारण क्या हो सकता है? मेरा पहला विचार राम या डिस्क भ्रष्टाचार था, लेकिन सभी ने ठीक से जांच की। मैं अपने ड्राइव को दोबारा सुधारने और सबकुछ पुनः स्थापित करने से बहुत दूर नहीं हूं, लेकिन मुझे डर है कि मैं अभी भी वही दुर्व्यवहार देखता हूं।

क्या यह मैक्रो या लिंक्ड लाइब्रेरी के लिए कहीं भी तकनीकी रूप से संभव है 'true' और 'false' के अर्थ को खराब करने के लिए कहीं भी?

अद्यतन: रहस्य को हल किया। मेरी मशीन पर एक पर्यावरण परिवर्तनीय झंडा 'झूठा' पर सेट किया गया था और जिस तरह से इसे कुछ प्रीप्रोसेसर कोड द्वारा इंटरपोल किया गया था, वह कीवर्ड को फिर से परिभाषित करता था।

+0

क्या आप केवल डीबगर में कदम उठाने पर समस्या को देख रहे हैं, या क्या यह वास्तव में नियंत्रण के प्रवाह को बदलता है? – tsellon

+0

क्या आप इसे रिलीज बिल्ड में डीबगर के तहत देख रहे हैं? अनुकूलन चर के रूप में अविश्वसनीय रूप से अविश्वसनीय होने का कारण बन सकता है। –

+0

हम केवल डीबग बिल्ड करते हैं। मैं डीबगर और सामान्य रूप से चलते समय दोनों में एक ही दुर्व्यवहार देखता हूं। – kingkongrevenge

उत्तर

13

एक प्रीप्रोसेसर मैक्रो निश्चित रूप से ऐसा कर सकता है, हालांकि यह बहुत आश्चर्यजनक होगा। अगर वह यह है कि एक तरह से जाँच करने के लिए मामला होगा

#ifdef true 
# error "true is defined as a macro" 
#endif 
#ifdef false 
# error "false is defined as a macro" 
#endif 

टिप्पणी करने के लिए उत्तर:

एक गैर हेडर फाइल जहाँ आप इस व्यवहार को प्राथमिकता कुछ #includes साथ एक को देखने का पता लगाएं।

शामिल की सूची के बीच में, #ifdef #Error निर्देशों डाल दिया।

त्रुटि यात्राएं आप जानते हैं कि यह, पहली छमाही के शामिल में अगर यह होता है नहीं तो यह दूसरी छमाही में है। आधा भाग विभाजित करें और दोहराएं। जब आप इसे एक शीर्षलेख तक सीमित करते हैं, तो उस शीर्षलेख को खोलें। यदि उस शीर्षलेख में हेडर शामिल हैं, तो हेडर की सूची के लिए प्रक्रिया दोहराएं। आखिरकार आपको # डिफाइन ढूंढने में सक्षम होना चाहिए। थकाऊ, मैं सहमत हूँ।

+0

सत्य और गलत मैक्रोज़ के रूप में परिभाषित किया गया है, लेकिन वे सही ढंग से परिभाषित हैं। Ifdef केस संवेदनशील है? मैक्रो को परिभाषित करने के लिए मुझे प्रीप्रोसेसर कैसे प्राप्त किया जा सकता है? – kingkongrevenge

+1

#undef true #undef false इसे ठीक करें। लेकिन मुझे नहीं पता कि गड़बड़ # डिफाइन कहां हैं। मैंने रेगेक्स को उन सभी शीर्षलेख फ़ाइलों को खोजने का प्रयास किया है जो मुझे मिल सकती हैं, लेकिन खाली हो गई हैं। – kingkongrevenge

+0

मैंने इन सवालों के साथ मदद करने के लिए अपना जवाब संपादित कर लिया है। –

3

सबसे अधिक संभावना एक हेडर फाइल मैक्रो के माध्यम से मूल्यों flipping है - हालांकि मैं क्यों एक अनुमान खतरे नहीं कर सका। सी ++ के रूप में फ़ाइल को सी और अन्य के रूप में संकलित करने का कोई भी मौका है और कुछ # ifdef/# कोड को परिभाषित किया गया है जो सही/गलत मानों को 'ठीक करने' का प्रयास कर रहा है, लेकिन उन्हें गलत मिला? #define true 0 के लिए

1

यह bool फिर से परिभाषित करने तकनीकी रूप से संभव है, लेकिन मैं नहीं देख सकते हैं जिनकी वजह से आपके विशेष वातावरण में केवल एक ही है, जहां इस मुद्दे सतहों होगा।

शायद कोई आपके साथ कुछ मजा ले रहा है?

5

बफर अतिप्रवाह और अप्रारंभीकृत स्मृति में लिख भी इस तरह के व्यवहार के लिए खाते में कर सकते हैं। उदाहरण के लिए, यदि आपके पास आसन्न स्मृति स्थानों में आवंटित एक सरणी और बूल है और गलती से सरणी की सीमाओं से परे लिखते हैं।

0

यहां तक ​​कि विजुअल स्टूडियो 2003 में भी कभी-कभी यह मेरे साथ होता है। लेकिन मुझे इसके लिए सही कारण नहीं पता है। यह फ़ंक्शन के रिटर्न वैल्यू की जांच करते समय होता है। भले ही मैं किसी फ़ंक्शन से सत्य लौट रहा हूं, कॉलिंग फ़ंक्शन में वापसी मान निर्दिष्ट करते समय, सत्य को गलत और गलत में परिवर्तित किया जा रहा है।

उस स्थिति में, मैं कुछ अन्य आउटपुट पैरामीटर की जांच करता हूं।

+0

गंभीरता से? यह आपके साथ होता है? अगर ऐसा होता है तो आप भविष्यवाणी की किसी भी डिग्री के साथ कोड लिखने का प्रबंधन कैसे करते हैं और आपको नहीं पता क्यों? –

+0

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

+0

ठीक है। ऐसा लगता है कि आपको नियमित रूप से यह समस्या थी। :) –

5

यदि आप डीबगर में परिवर्तनीय मानों की जांच करते समय यह समस्या देख रहे हैं, और आप रिलीज बिल्ड चला रहे हैं, तो यह केवल डिबगिंग सिस्टम का आर्टिफैक्ट हो सकता है। इस जांच करने के लिए सबसे आसान तरीका है की तर्ज पर कुछ कोड जोड़ने के लिए होगा:

if (mybool) 
    printf("mybool is true\n"); 
else 
    printf("mybool is false\n"); 

आप जल्दी से पहचान करने के लिए है कि क्या डिबगर सही है या नहीं कर सकेंगे।

4

पहला, वीसी 6 प्राचीन और छोटी गाड़ी है। ऐसे मामले हैं जहां यह गलत कोड उत्पन्न करता है, जो आपकी समस्या का उत्तर हो सकता है। यदि आपके पास कोई विकल्प है तो वीसी 6 का उपयोग न करें।

दूसरा, जो आप देख रहे हैं वह शायद अनुकूलन का परिणाम है। क्या आपका कोड सही तरीके से व्यवहार करता है? यदि ऐसा है, तो यह है कि डीबगर भ्रमित हो जाता है क्योंकि निष्पादित कोड स्रोत कोड की तुलना में अलग है (अनुकूलन के कारण)।

3

मुझे अस्पष्टता से याद है कि वीसी 6 के साथ आप प्री-प्रोसेसर को स्वयं ही चला सकते हैं और इसके आउटपुट को देख सकते हैं। यह एक कंपाइलर स्विच हो सकता है।

किसी भी घटना में, यह लगभग निश्चित रूप से # डिफाईन्स का परिणाम बन गया है। यदि यह एक स्मृति ओवरराइट था, जैसा कि सुझाव दिया गया है, तो आप शायद अन्य समान विचित्र व्यवहार देख रहे होंगे।

1

इस तरह की समस्याएं डरावनी हैं, क्योंकि आपके पास वास्तव में शुरू करने के लिए कोई जगह नहीं है।

पहला परीक्षण जो मैं करता हूं वह है कि आप अपने प्रोजेक्ट के लिए सभी स्रोत कोड "#define" और "true", या "#define" और "false" से मेल खाते हैं। यदि आपके पास पर्ल को कौन जानता है, तो यह एक तेज स्क्रिप्ट होना चाहिए।

क्या आप कुछ बाहरी पुस्तकालयों के खिलाफ जुड़ने पर निर्भर हैं जो बदल सकते हैं? आप कुछ है कि आप के खिलाफ लिंक कर रहे हैं के साथ कुछ weirdness संदेह है, तो आप है निम्न चरणों को आज़मा सकते हैं:

  • एक प्रोग्राम है जो सही/गलत का मूल्य की जाँच करता है सुनिश्चित करें।
  • इस प्रोग्राम को संकलित करें, इस प्रोग्राम को अपने स्रोत कोड के सभी पुस्तकालयों के विरुद्ध लिंक करना सुनिश्चित करें।
  • अपना प्रोग्राम चलाएं, और देखें कि आपका न्यूनतम प्रोग्राम आपकी समस्या को प्रभावित करने वाली वास्तविक/झूठी बग प्रदर्शित करता है या नहीं।

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

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

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