मुझे हाल ही में मेरे कोड पर एक बग मिला जो मुझे डीबग करने में कुछ घंटे लगा।क्यों कुछ अंतर्निहित प्रकार रूपांतरण मशीन पर सुरक्षित हैं और दूसरे पर नहीं ?? मैं इस क्रॉस प्लेटफ़ॉर्म के मुद्दों को कैसे रोक सकता हूं?
समस्या एक समारोह में परिभाषित किया गया था के रूप में:
unsigned int foo(unsigned int i){
long int v[]={i-1,i,i+1} ;
.
.
.
return x ; // evaluated by the function but not essential how for this problem.
}
वी की परिभाषा मेरे विकास मशीन (Ubuntu 12.04 32 बिट, जी ++ संकलक), जहां अहस्ताक्षरित int परोक्ष थे पर किसी भी मुद्दे का कारण नहीं लंबे int में परिवर्तित हो गया और इस तरह के नकारात्मक मान सही ढंग से संभाले गए थे।
एक अलग मशीन पर (उबंटू 12.04 64 बिट, जी ++ कंपाइलर) हालांकि यह ऑपरेशन सुरक्षित नहीं था। जब मैं = 0, वी [0] -1 पर सेट नहीं किया गया था, लेकिन कुछ अजीब बड़े मूल्य के लिए (जैसा कि अक्सर हस्ताक्षर किए गए int नकारात्मक बनाने की कोशिश करते समय होता है)।
मैं लंबे समय से पूर्णांक
long int v[]={(long int) i - 1, (long int) i, (long int) i + 1};
को मुद्दा मैं का मूल्य कास्टिंग का समाधान कर सकता है और सब कुछ ठीक (दोनों मशीनों पर) में काम किया।
मुझे पता नहीं लगा कि मशीन पर पहला काम ठीक क्यों होता है और दूसरे पर काम नहीं करता है।
क्या आप इसे समझने में मेरी सहायता कर सकते हैं, ताकि मैं भविष्य में इस या अन्य मुद्दों से बच सकूं?
धन्यवाद।मुझे पूरी तरह से यकीन नहीं है, लेकिन मुझे याद है कि लंबे int int unsigned int के लिए पर्याप्त हैं (कम से कम कुछ सी ++ संदर्भों के अनुसार जो आप ऑनलाइन पा सकते हैं)। वैसे भी मैं मानता हूं कि अच्छा मिश्रण है कि उन्हें मिश्रण न करें, लेकिन इस मामले में मेरे लिए ऐसा करना आवश्यक है। मैं जानना चाहता था कि ये मशीन निर्भर मुद्दों कब उत्पन्न हो सकती हैं। – lucacerone