2009-12-20 19 views
5

मैं सी # से डेल्फी 200 9 में दोषपूर्ण हूं, मुझे अब तक बहुत पसंद है।मेरा "अगर" कथन क्यों नहीं चल रहा है?

मैंने एक बाइनरी खोज प्रक्रिया लिखी, जो ठीक काम करता है। मैंने अपनी प्रो के अंत में एक सरल अगर-और कथन जोड़ा और यह आग नहीं लगा! मैं इसके साथ कुछ भी गलत नहीं देख सकता हूं और कहने के लिए शर्मिंदा हूं कि मैं फंस गया हूं। कृपया सहायता कीजिए!

procedure BinSearch; 
var 
    min,max,mid, x: integer; 
    A : array[0..4] of integer; 
    rslt : integer; 

begin 

    writeln('binary search'); 
    A[0] := 34; A[1] := 65; A[2] := 98; A[3] := 123; A[4] := 176; 
    listarray(a); 
    x := 62; 
    min := 0; 
    max := 4; 

    repeat 
    begin 
    mid := (min + max) div 2; 
    if x > A[mid] then 
     min := mid + 1 
    else 
     max := mid - 1; 
    end; 
    until (A[mid] = x) or (min > max); 

    writeln(mid); 
    writeln(a[mid]); 

    if A[mid] = x then 
    rslt := mid 
    else 
    rslt := not mid; 

    if 54 = 65 then 
    rslt := mid 
    else 
    rslt := not mid; 

end; 

यह if A[mid] = x then है जो आग नहीं करेगा। जब न तो सही या झूठी शाखाओं को आग लगाना, डीबगर बस उन पर सीधे छोड़ देता है। if 54 = 65 then जो सिर्फ एक परीक्षण है वही करता है।

यदि मेरे दोहराना लूप के अंदर अगर ठीक काम करता है।

यदि मैं मिनी टेस्ट प्रो में कथन में समस्या की प्रतिलिपि बनाता हूं, और उसके बाद प्रो को कॉल करता है तो यह काम करता है, इसलिए यह मुझे लगता है कि यह गायब ; की तरह प्रो में कुछ और है जिससे कुछ अजीब होता है लेकिन मैं इसे नहीं देख सकता । कृपया सहायता कीजिए!

+6

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

+5

स्टैक ओवरफ्लो और डेल्फी में आपका स्वागत है। –

+1

बस एक टिप, आपको दोहराने तक लूप तक स्टार्ट-एंड जोड़ी की आवश्यकता नहीं है। – Todd

उत्तर

4

यह हो सकता है कि डिबगर सिर्फ उन बयानों भले ही वे वास्तव में चल रहे अधिक लंघन है। सुनिश्चित करें कि डिबगिंग विकल्पों में सभी विकल्प चालू हैं। डेल्फी 7 में, वे कंपाइलर टैब के तहत प्रोजेक्ट \ विकल्प के अंतर्गत हैं।

+0

आपके लिए त्वरित प्रतिक्रिया धन्यवाद। सब ठीक है - यह सब साथ काम कर रहा था! मैं डीबगर विकल्पों में बदलने के लिए कुछ भी नहीं देख सका, लेकिन यह वास्तव में फायरिंग था और डीबगर में बस छोड़ रहा था। मुझे लगता है क्योंकि अगर ... और ...; एक कथन इसके साथ कुछ करने के लिए है, हालांकि यह बहुत अजीब बात है कि कैसे डिबगर अन्य स्थानों पर समान कोड में कदम उठाएगा, न कि दूसरों पर। मुख्य बात यह है कि यह काम कर रहा है। मैं अब स्टंप नहीं हुआ हूं और यह मुख्य बात है, आपकी मदद के लिए धन्यवाद और मेरे गधे के प्रश्न के लिए धन्यवाद। – user235325

+0

हां, डिबग बिल्डिंग में डेल्फी ऑप्टिमाइज़र कभी-कभी मुझे थोड़ा अधिक आक्रामक लगता है। –

14

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

यदि आप अपनी प्रक्रिया के अंत में Writeln(rslt); जोड़ते हैं, तो आप पाएंगे कि डीबगर अब आपके if कथन के माध्यम से पता लगाएगा।

+0

मैंने पहले इस व्यवहार को देखा है, और मैं शर्त लगाता हूं कि वास्तव में क्या हो रहा है! +1 –

0

"दोहराना" कथन के बाद "प्रारंभ" कथन वहां नहीं होना चाहिए। एक "दोहराना" शुरूआत का उपयोग नहीं करता है। मैं यह सुनिश्चित करने के लिए इसे हटा दूंगा कि इससे कोई समस्या नहीं आती है।

0

"rslt" का उपयोग नहीं किया जाता है। इसलिए डेल्फी इसे अनुकूलित करता है।

जाहिर है, आप अपने परिणाम वापस जाने के लिए चाहते हैं। तो अपने घोषणा को बदलने के लिए:

procedure BinSearch(var rslt: integer); 

या बेहतर है, यह एक समारोह बनाने:

function BinSearch: integer; 

और अंत में में डाल दिया:

Result := rslt; 

ऊपर के दोनों करते हैं, और आप 'पाएंगे कि उन बयानों को अब खत्म हो गया छोड़ दिया गया क्योंकि rslt अब किया जा रहा है।

लेकिन, आप आप अपने बयान के साथ एक समस्या है जाएगा मिल जाएगा:

rslt := not mid; 

क्योंकि मध्य एक पूर्णांक है। मुझे यकीन है कि तुम क्या यहाँ लौटना चाहते नहीं कर रहा हूँ, लेकिन मुझे पता है तुम "नहीं" ऑपरेटर "मध्य" को लागू किया जा नहीं करना चाहती।


इस कोड को देखें I got from wikibooks। यह आप यह पता लगा मदद कर सकता है।

(* Returns index of requested value in an integer array that has been sorted 
in ascending order -- otherwise returns -1 if requested value does not exist. *) 

function BinarySearch(const DataSortedAscending: array of Integer; 
const ElementValueWanted: Integer): Integer; 
var 
    MinIndex, MaxIndex: Integer; 
    { When optimizing remove these variables: } 
    MedianIndex, MedianValue: Integer; 
begin 
    MinIndex := Low(DataSortedAscending); 
    MaxIndex := High(DataSortedAscending); 
    while MinIndex <= MaxIndex do begin 
     MedianIndex := (MinIndex + MaxIndex) div 2; (* If you're going to change 
     the data type here e.g. Integer to SmallInt consider the possibility of 
     an overflow. All it needs to go bad is MinIndex=(High(MinIndex) div 2), 
     MaxIndex = Succ(MinIndex). *) 
     MedianValue := DataSortedAscending[MedianIndex]; 
     if ElementValueWanted < MedianValue then 
      MaxIndex := Pred(MedianIndex) 
     else if ElementValueWanted = MedianValue then begin 
      Result := MedianIndex; 
      Exit; (* Successful exit. *) 
     end else 
      MinIndex := Succ(MedianIndex); 
    end; 
    Result := -1; (* We couldn't find it. *) 
end; 
संबंधित मुद्दे