2010-03-10 3 views
5

मैं कोड का सा है कि एक अधःप्रवाह का कारण बनता है है:

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

    delta := (t2 - t1); 

घटाव ही एक अतिप्रवाह (अधःप्रवाह) उत्पन्न करता है, लेकिन मैं डेल्फी एक EIntOverflow अपवाद फेंकने के लिए नहीं करना चाहती। तो मैं अतिप्रवाह जाँच को अक्षम करके अतिप्रवाह जाँच कोड की पीढ़ी अक्षम करके देखें: यहां तक ​​कि OVERFLOWCHECKS OFF विकल्प के साथ फिर भी

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

{$OVERFLOWCHECKS OFF} 
    delta := (t2 - t1); 
{$OVERFLOWCHECKS ON} 

, यह अभी भी एक अपवाद फेंकता है।

alt text http://i43.tinypic.com/intmrl.jpg

$Q पर दस्तावेज की एक रिमाइंडर:

ओवरफ्लो जाँच

प्रकार स्विच
सिंटेक्स {और उत्पन्न कोड अभी भी जांच में शामिल है $ क्यू +} या {$ क्यू-}
{$ OVERFLOWCHECKS पर} या {$ OVERFLOWCHECKS बंद}
डिफ़ॉल्ट {$ Q-}
{$ OVERFLOWCHECKS बंद}
स्कोप स्थानीय

टिप्पणियां

$ Q निर्देश ओवरफ्लो जांच कोड की पीढ़ी को नियंत्रित करता है। {$ क्यू +} राज्य में, कुछ पूर्णांक अंकगणितीय आपरेशनों (+, -, *, ABS, Sqr, succ, Pred, इंक, और दिसम्बर) अतिप्रवाह के लिए जाँच कर रहे हैं। के लिए कोड इन पूर्णांक अंकगणित संचालन के बाद अतिरिक्त कोड है जो सत्यापित करता है कि परिणाम समर्थित सीमा के भीतर है। यदि ओवरफ़्लो चेक विफल हो जाता है, तो EIntOverflow अपवाद उठाया जाता है (या प्रोग्राम समाप्त होता है यदि अपवाद हैंडलिंग सक्षम नहीं है)।

$ Q स्विच आमतौर पर $ आर स्विच, जो सक्षम बनाता है और रेंज-चेकिंग कोड की पीढ़ी को निष्क्रिय साथ संयोजन के रूप में प्रयोग किया जाता है। ओवरफ्लो को सक्षम करने से आपके प्रोग्राम को धीमा कर दिया जाता है और इसे कुछ हद तक बड़ा बनाता है, इसलिए केवल $ $ Q +} का उपयोग डीबगिंग के लिए करें।

मैं ओवरफ्लो चेकिंग कोड की पीढ़ी को अक्षम करने के लिए $OVERFLOWCHECKS OFF का उपयोग कैसे करूं?


मेसन का जवाब काम करता था।संशोधित कोड है:

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

    delta := Subtract(t2, t1); 


{$OVERFLOWCHECKS OFF} 
function Subtract(const B, A: DWORD): DWORD; //subtract B-A 
begin 
    { 
     Disabling overflow checking does not work at the line level, 
     only the routine level. 
     Hence the function to subtract two numbers. 
    } 
    Result := (B-A); 
end; 
{$OVERFLOWCHECKS ON} 

गूगल क्रॉलर, वैकल्पिक प्रश्न शब्दों के लिए: कैसे अस्थायी रूप से अतिप्रवाह डेल्फी में जाँच निष्क्रिय करने के लिए?

उत्तर

12

यह लाइन स्तर पर काम नहीं करता है। आपको पूरे समारोह के लिए इसे बंद करने की आवश्यकता है।

+0

मुझे इस और अन्य अन्य कंपाइलर विकल्पों पर विशेष रूप से '$ RANGECHECKS'' पर दस्तावेज़ देखने में बहुत दिलचस्पी होगी ... लेकिन +1 "यह उत्तर उपयोगी है) –

+3

रेंज जांच * लाइन स्तर पर काम करता है। ओवरफ्लो चेकिंग केवल फ़ंक्शन स्तर पर काम करती है। जब भी कंपाइलर 'एंड' तक पहुंचता है, तो उस सेटिंग को प्रभावी रूप से पूरा किया जाएगा, जो पूरे फ़ंक्शन के मशीन कोड को उत्पन्न करने के लिए उपयोग किया जाएगा। यह इस तरह से दस्तावेज नहीं है, लेकिन जिस तरह से यह हमेशा के लिए काम करता है अनुकूलन भी कार्य स्तर पर ही काम करता है; यह दस्तावेज है। –

+0

मैं यहां कुछ डेल्फी कोड से आया था जो लाइन स्तर पर {$ Q +/-} का उपयोग कर रहा था। उत्तर में उल्लिखित {$ OVERFLOWCHECKS चालू/बंद} पर स्विच करके उपर्युक्त, लेकिन पूरे कार्य को घेरने के लिए उनका उपयोग करते हुए इस जवाब के मुताबिक, मैं अतिप्रवाह जांच को बंद करने में सक्षम था। हालांकि, मुझे लाइन स्तर {$ Q +/-} c को हटाना पड़ा ओंपिलर निर्देश जो पहले से ही थे या मुझे अभी भी अतिप्रवाह अपवाद मिला है। –

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