2010-06-08 23 views
6

में डेल्फी टाइप किए गए स्थिरांक डेल्फी में case कथन में टाइप किए गए स्थिरांक का उपयोग करने का सबसे सुरुचिपूर्ण (या कम से कम बदसूरत) तरीका क्या है?बयान

है यही कारण है, इस सवाल यह है कि आप

const 
    MY_CONST: cardinal = $12345678; 
    ... 

में के रूप में एक टाइप किया निरंतर घोषित करने के लिए की जरूरत के लिए मान लेते हैं तो फिर डेल्फी संकलक को स्वीकार नहीं करेगा

case MyExpression of 
    MY_CONST: { Do Something }; 
    ... 
end; 

लेकिन आप

लिखने की ज़रूरत
case MyExpression of 
    $12345678: { Do Something }; 
    ... 
end; 

जो त्रुटि-प्रवण है, अद्यतन करने में कठोर है, और सुरुचिपूर्ण नहीं है।

क्या कोई चाल है जिसे आप स्थिरांक के मूल्य को सम्मिलित करने के लिए नियोजित कर सकते हैं (अधिमानतः स्रोत कोड में const के तहत निरंतर के मान की जांच करके, लेकिन शायद रनटाइम पर मान को देखकर)? हम यहां मानते हैं कि आप रनटाइम पर "स्थिर" के मान को नहीं बदलेंगे।

+1

कुछ कोशिश कर सकते हैं को टाइप करने। समस्या सुलझ गयी। आपको टाइप अस्वीकरण का उपयोग करने की आवश्यकता नहीं है और वास्तव में आपको उनका उपयोग करने की आवश्यकता नहीं है। –

+0

हाँ, मुझे पता है। लेकिन मैंने स्पष्ट रूप से लिखा "इस प्रश्न के लिए मान लीजिए कि आपको टाइप किए गए निरंतर घोषित करने की आवश्यकता है" ... –

उत्तर

12

पर क्यों आधार पर आप लगातार आप बाहर ले तरह

const 
    MY_REAL_CONST = Cardinal($12345678); 
    MY_CONST: Cardinal = MY_REAL_CONST; 

case MyExpression of 
    MY_REAL_CONST: { Do Something }; 
    ... 
end; 
+1

+1! –

+1

@ एंड्रियास: यदि आपको यह मेरा से बेहतर जवाब मिल गया है, तो आप इसके बजाय इसे स्वीकार कर सकते हैं। तो आपको स्वीकार्य उत्तर बदलने की अनुमति देता है। –

+0

@ मेसन व्हीलर: आप सही हैं।हालांकि मैं मानता हूं कि टाइप की गई स्थिरांक के बिना अधिकांश समस्याओं को हल किया जा सकता है (और अंततः मैं सामान्य स्थिरांक का उपयोग करके अपना कोड दोबारा लिखता हूं), यह वास्तविक प्रश्न का उत्तर है, इसलिए मैं इसे स्वीकार करूंगा। –

4

यदि आप स्थिर के मान को नहीं बदलेंगे, तो आपको इसे टाइप किए गए स्थिर होने की आवश्यकता नहीं है। संकलक उस नंबर को ले सकता है जिसे आप घोषित करते हैं और इसे सही रूप से उस चर या पैरामीटर में डालते हैं जिसे आप इसे असाइन करते हैं। टाइप किए गए स्थिरांक एक हैक के प्रकार होते हैं, और वे वास्तव में चर के रूप में कार्यान्वित होते हैं, इसलिए संकलक उन्हें उन स्थिरांक के रूप में उपयोग नहीं कर सकते जिनके मूल्य को संकलन-समय पर तय किया जाना चाहिए।

+0

मुझे पता है। लेकिन यह सवाल का जवाब नहीं देता है, क्योंकि मैंने लिखा था "इस सवाल के लिए मान लें कि आपको एक टाइप किए गए निरंतर घोषित करने की आवश्यकता है"। लेकिन आम तौर पर, मैं सहमत हूं: मैं इस तरह के एक प्रश्न का भी उत्तर दूंगा: "**** आपको टाइप किए गए स्थिरांक का उपयोग करने की आवश्यकता क्यों है?"। –

+0

लेकिन फिर भी, जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही मुझे एहसास होता है कि अगर आपको कोई समस्या है तो आपको कुछ और "हैक" करना चाहिए ... –

+6

* अगर आप टाइप किए गए स्थिरांक का उपयोग कर रहे हैं क्योंकि आप इसे एक विशिष्ट प्रकार के रूप में देखना चाहते हैं (उदाहरण के लिए इस उदाहरण में कार्डिनल) आप MyConst = Cardinal ($ FFFFFFFE) के रूप में घोषित कर सकते हैं; केस My_CONST का MyExpression: {कुछ करें}; ... अंत; – Remko

0

टाइप स्थिरांक, मामले बयान में नहीं किया जा सकता क्योंकि एक टाइप किया निरंतर वास्तव में है और अधिक एक स्थिर चर (और आबंटित ...), और इस तरह एक मामले बयान है, जो स्थिरांक की उम्मीद में की सेवा नहीं कर सकते हैं। ": कार्डिनल"

+0

मैंने लिखा नहीं होगा "हम यहां मानते हैं कि आप रनटाइम पर" स्थिर "के मान को नहीं बदलेंगे।" अगर मुझे यह नहीं पता था! :) –

+0

बहुत बुरा, डेल्फी यह नहीं मानता है, और टाइप किए गए स्थिर को बदलने की अनुमति देता है। वास्तविक प्रश्न का उत्तर होने के लिए –

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