2012-07-25 15 views
9

यहां कुछ कोड का एक संघीय संस्करण है जो एक रेंज चेक त्रुटि और ओवरफ्लो त्रुटि दोनों का कारण बनता है, क्या मुझे उन कंपाइलर चेक निर्देशों को चालू करना चाहिए। मैं समझता हूं कि यह सी 1 के गुणा पर एक अतिप्रवाह क्यों पैदा करेगा, ऐसा लगता है कि यह डेटा-प्रकार के अधिकतम मूल्यवान से अधिक हो सकता है। लेकिन यह एक रेंज-चेक त्रुटि क्यों ट्रिगर करेगा? डेल्फी के प्रलेखन और स्टैक ओवरफ़्लो पर अन्य पोस्ट इसे ध्वनि-जांच त्रुटियों की तरह ध्वनि बनाते हैं जो आम तौर पर सीमाओं से बाहर सरणी एक्सेस के लिए होते हैं। लेकिन मैं लाइन पर एक सरणी तक नहीं पहुंच रहा हूं जो कह रहा है कि रेंज-चेक त्रुटि उत्पन्न हो रही है। शायद यह param1 के लिए असाइनमेंट पर? लेकिन यह एक सीमा-जांच क्यों होगी और अगर ओवरफ्लो त्रुटि नहीं है, तो ऐसा क्यों होगा? जब मैं डेल्फी पूछना यह मूल्यांकन करने के लिए:रेंज चेक त्रुटि का कारण (डेल्फी)

const 
    C1 = 44001; 
    C2 = 17999; 

function fxnName(..other params...; param1: Word): String; 
var 
    someByte: byte; 
begin 
    // some code 
    // by now we're in a loop. the following line is where it breaks to in the debugger: 
    param1 := (someByte + param1) * C1 + C2; 
    // more code 
end; 

यदि यह प्रासंगिक है, जब यह डीबगर में है कि लाइन पर टूट जाता है, सभी मूल्यों के रूप में उम्मीद, param1, जो दिखाता है " 'param1' अघोषित पहचानकर्ता" को छोड़कर देखो।

+0

मुझे लगता था कि सिर्फ इसलिए कि सीमा की जांच अतिप्रवाह जांच से पहले होता यह है, और सीमा एक बार चेक अपवाद उठाया जाता है ओवरफ्लो चेक कभी नहीं होता है। (ऑर्डर के बारे में सुनिश्चित नहीं है, इसलिए यह सिर्फ एक संदेह है।) –

उत्तर

17

रेंज की जाँच राज्यों के बारे में दस्तावेज:

$ आर निर्देश सक्षम बनाता है या सीमा-चेकिंग कोड की पीढ़ी अक्षम करता है। {$ R +} स्थिति में, सभी सरणी और स्ट्रिंग-इंडेक्सिंग अभिव्यक्ति परिभाषित सीमाओं के भीतर होने के रूप में सत्यापित की जाती हैं, और स्केलर और सबरेंज चर के सभी असाइनमेंट को सीमा के भीतर चेक किया जाता है। यदि कोई रेंज चेक विफल हो जाता है, तो एक ERangeError अपवाद उठाया जाता है (या अपवाद हैंडलिंग सक्षम नहीं होने पर प्रोग्राम समाप्त हो जाता है)।

तो यहां कारण स्केलर मान के लिए असाइनमेंट है, जिसे ऊपरी सीमा पारित करने वाला मान दिया जाता है।

सरल प्रकार और उप-प्रकार प्रकारों पर रेंज-जांच त्रुटियों के बारे में docwiki Simple Types भी देखें।

उदाहरण:

{$R+} // Range check on 
var 
    w1,w2 : word; 
begin 
    w1 := High(word); 
    w1 := w1 + 10; // causes range-check error on assignment to w1 (upper range passed) 
    w2 := 0; 
    w2 := w2 - 10; // causes range-check error on assignment to w2 (lower range passed) 
end; 

सभी मंच स्वतंत्र पूर्णांक प्रकार के लिए $ आर तथा $ Q के सभी संयोजनों का एक सारांश परीक्षण:

  R+Q+ R+Q- R-Q+ 
ShortInt R  R  x 
SmallInt R  R  x 
Integer  O  x  O 
LongInt  O  x  O 
Int64  O  x  O 
Byte  R  R  x 
Word  R  R  x 
LongWord O  x  O 
Cardinal O  x  O 
UInt64  O  x  O 

आर = रेंज त्रुटि; ओ = ओवरफ्लो त्रुटि; एक्स = कुछ भी नहीं

और परीक्षण किया गया था (छद्म कोड) XE2 साथ 32-बिट मोड में:

number := High(TNumber); 
number := number + 1; 
+1

@ डेविड हेफरन, दस्तावेज़ पढ़ें, बस कोड का परीक्षण किया और यह रेंज-चेक त्रुटियां उत्पन्न करता है। आपको इसके बाद पढ़ना होगा, अर्थात् जहां यह कहता है कि स्केलर और सबरेंज चर के लिए सभी असाइनमेंट चेक किए गए हैं। –

+0

संभवतया यह ओवरफ़्लो त्रुटि होगी यदि डेटा प्रकार पूर्णांक –

+0

@DavidHeffernan यदि गणना 'इंटीगर' प्रकारों पर गणना की जाती है, तो निश्चित रूप से, लेकिन 'i: = i + Int64 (1); * * चाहिए * (अवांछित) कारण हो सकता है रेंज त्रुटि जब 'i'' MaxInt' के मान के साथ 'इंटेगर' है। – hvd

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