2012-05-23 14 views
7

मैं निम्नलिखित प्रक्रिया है: डिग्री चरक्यों संकलक बताए छोड़ देता है तो चर

procedure GetDegree(const num : DWORD ; var degree : DWORD ; min ,sec : Extended); 
begin 
    degree := num div (500*60*60); 
    min := num div (500*60) - degree *60; 
    sec := num/500 - min *60 - degree *60*60; 
end; 

के बाद प्रक्रिया के अंत के लिए सौंप दिया जाता है डिबगर द्वारा छोड़ने। ऐसा क्यों है?

उत्तर

17

यह एक अनुकूलन है। चर min और sec मान द्वारा पारित किए जाते हैं। इसका मतलब है कि उन्हें संशोधक कॉलर द्वारा नहीं देखा जाता है और इस प्रक्रिया के लिए निजी हैं। इसलिए संकलक काम कर सकता है कि उन्हें असाइन करना व्यर्थ है। चर को आवंटित मान कभी नहीं पढ़ा जा सकता है। तो संकलक समय बचाने और असाइनमेंट को छोड़ने के लिए चुनता है। मैं उम्मीद करते हैं कि आप इस तरह की प्रक्रिया की घोषणा करने के लिए होती:

procedure GetDegree(const num: DWORD; var degree: DWORD; var min, sec: Extended); 

जैसा कि मैंने अपने पिछले प्रश्न में कहा, वहाँ वास्तव में नहीं Extended का प्रयोग करने में ज्यादा बात है। आप मानक फ्लोटिंग पॉइंट प्रकारों में से एक, Single या Double से बेहतर होंगे। या यहां तक ​​कि जेनेरिक Real का उपयोग करना जो Double पर मानचित्र करता है।

इसके अलावा, आपने min को फ़्लोटिंग पॉइंट प्रकार के घोषित करने के लिए घोषित किया है, लेकिन गणना एक पूर्णांक की गणना करती है। आपके पिछले प्रश्न का मेरा जवाब इस संबंध में काफी सटीक है।


मैं अनुशंसा करता हूं कि आप इन मानों को पकड़ने के लिए एक रिकॉर्ड बनाएं। चार अलग-अलग चरों को पास करने से आपका फ़ंक्शन बहुत गन्दा हो जाता है और encapsulation को तोड़ देता है। इन तीन मानों का अर्थ केवल संपूर्ण रूप में विचार करते समय होता है।

type 
    TGlobalCoordinate = record 
    Degrees: Integer; 
    Minutes: Integer; 
    Seconds: Real; 
    end; 

function LongLatToGlobalCoordinate(const LongLat: DWORD): TGlobalCoordinate; 
begin 
    Result.Degrees := LongLat div (500*60*60); 
    Result.Minutes := LongLat div (500*60) - Result.Degrees*60; 
    Result.Seconds := LongLat/500 - Result.Minutes*60 - Result.Degrees*60*60; 
end; 

function GlobalCoordinateToLongLat(const Coord: TGlobalCoordinate): DWORD; 
begin 
    Result := Round(500*(Coord.Seconds + Coord.Minutes*60 + Coord.Degrees*60*60)); 
end; 
+0

धन्यवाद एक बार फिर डेविड आप कर दिया गया एक जबरदस्त मदद today.Didn't इन लानत optimzations बारे में पता था है मैं कोड के इस टुकड़े से उन्हें हटा सकते हैं? – opc0de

+6

@ opc0de आप अनुकूलन को हटाना नहीं चाहते हैं। आप अपना कोड ठीक करना चाहते हैं ताकि यह कॉलर को 'min' और' sec' मान वापस कर सके। अन्यथा आप उन्हें पहली जगह की गणना करने के लिए परेशान क्यों कर रहे हैं? –

+0

ठीक है अब इसे मिला। धन्यवाद फिर बेवकूफ गलती :)! – opc0de

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