2013-08-26 2 views
8

में स्थिरांक को परिभाषित करने में त्रुटि मैं डेल्फी (डेल्फी 2005 जो है) में एक कॉन्स को परिभाषित करने की कोशिश कर रहा हूं जो कि अन्य स्थिरांक पर आधारित है, लेकिन डेल्फी शिकायत करता है कि यह निरंतर अभिव्यक्ति नहीं है।डेल्फी

program myProgram; 

const 
    Xpoints = 20; 
    Ypoints = 30; 
    ArraySize = trunc(sqrt(Xpoints*Ypoints)); 

var 
    myArray : array[1..ArraySize] of integer; 

मैं कर सकता ArraySize = Xpoints * Ypoints लेकिन sqrt समस्याओं का कारण बनता: ​​इस तरह मेरे कोड दिखता है। विचार यह है कि मैं सरणी को एक्सपॉइंट्स और वाईपॉइंट्स द्वारा सरणी का आकार देना चाहता हूं। मैं ऐसा कुछ कर सकता था:

program myProgram; 

const 
    sqrtXpoints = 4.472135956; 
    sqrtYpoints = 5.47722557506; 
    Xpoints = trunc(sqrtXpoints*sqrtXpoints); 
    Ypoints = trunc(sqrtYpoints*sqrtYpoints); 
    ArraySize = trunc(sqrtXpoints*sqrtYpoints); 

var 
    myArray : array[1..ArraySize] of integer; 

ट्रंक के लिए वर्ग रूट मानों को थोड़ा अधिक ध्यान देने की देखभाल करना। अगर मैं sqrtXpoints या sqrtYpoints बदलता हूं, तो सब ठीक से अपडेट हो जाएगा, लेकिन यह दृष्टिकोण बस ऐसा लगता है ... बेवकूफ।

एक अस्थायी ठीक जैसा कि मैंने लगातार अपने आप को इस तरह का मूल्यांकन कर सकते हैं:

program myProgram; 

const 
    Xpoints = 20; 
    Ypoints = 30; 
    ArraySize = 24; 

var 
    myArray : array[1..ArraySize] of integer; 

लेकिन मुझे यह पसंद नहीं है क्योंकि ArraySize स्वचालित रूप से अगर मैं Xpoints या Ypoints बदलने अपडेट नहीं होता।

यह संकलक की तरह लगता है पता होना चाहिए कि कैसे एक निरंतर ऊपर और इस तरह भी सरल बातों के लिए उदाहरण जैसी चीजों के लिए संकलन समय पर एक और निरंतर का एक गणितीय समारोह के रूप में परिभाषित किया गया मूल्यांकन करने के लिए:

const 
    pi = 4.0*arctan(1.0); 

लेकिन मैं इसे स्वीकार करने के लिए नहीं मिल सकता है। कोई सुझाव? आपकी सहायता के लिये पहले से ही धन्यवाद!

+1

आप बस लगातार घोषणाओं में कार्यों का उपयोग नहीं कर सकते। –

+1

कंपाइलर 'sqrt' का मूल्यांकन नहीं करेगा। आप मान सकते हैं, टाइप किए गए स्थिरांक का उपयोग करें और प्रारंभिक समय पर इसे ठीक करें। उस उड़ान को बनाने के लिए आपको कुछ वर्चुअलअलोक कॉल की आवश्यकता होगी। –

+0

एक और वर्कअराउंड विकल्प एक कंपाइलर का उपयोग करना है जो निरंतर अभिव्यक्तियों (एफपीसी) पर कम पसंद है। – OnTheFly

उत्तर

7

डेल्फी स्थिरांक की परिभाषा में अधिकांश कार्यों का उपयोग करने की अनुमति नहीं देता है। लेकिन आप आसान इसे हल कर सकते हैं, बस गतिशील सरणियों का उपयोग करें और आप आप अपने कोड से चाहते हैं सभी गणना करने में सक्षम हो जाएगा:

const 
    Xpoints = 20; 
    Ypoints = 30; 
var 
    myArray : array of integer; 

procedure TForm9.FormCreate(Sender: TObject); 
begin 
    setlength(myArray, trunc(sqrt(Xpoints*Ypoints))); 

end; 
+0

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

+1

पूरे प्रश्न पाठ को पढ़ने से, मैंने एक राय विकसित की कि ओपी खुद को एक कामकाज का पता लगा सकता है। – OnTheFly

+4

मैं आपको इस कोड को इकाई के 'प्रारंभिकरण' अनुभाग में स्थानांतरित करने का सुझाव दूंगा। – TLama