2012-03-11 15 views
7

कृपया ध्यान दें कि यह केवल एक विचार प्रयोग है।
मुझे पता है कि वैश्विक (स्थैतिक) युद्ध खराब हैं और किसी भी मामले में तोड़ने का दायरा एक बुरा विचार है।क्या स्थानीय टाइप किए गए निरंतर को * बाहरी * से घोषित दिनचर्या में बदलने का कोई तरीका है?

निम्नलिखित कोड पर विचार करें:

function IsItChanged: integer; 
const 
    CanIBeChanged: integer = 0; 
begin 
    Result:= CanIBeChanged; 
end; 

लिखने योग्य स्थिरांक सक्षम कर दिए गए मान लिया जाये कि, मैं कैसे समारोह में यह घोषणा की है के दायरे से बाहर से CanIBeChanged का मूल्य बदल सकते हैं?

पीएस नहीं, मैं इस कोड का कभी भी उपयोग करने का इरादा नहीं रखता हूं, यह सिर्फ ब्याज से एक प्रश्न है।

उत्तर

12

ठीक है, यह केवल लिखने योग्य टाइप किए गए स्थिरांक को पॉइंटर लीक करके ही किया जा सकता है।

program NaughtyNaughtyVeryNaughty;{$J+} 
{$APPTYPE CONSOLE} 
procedure Test(out MyPrivatesExposed: PInteger); 
const 
    I: Integer=665; 
begin 
    MyPrivatesExposed := @I; 
    inc(I); 
end; 

var 
    I: PInteger; 
begin 
    Test(I); 
    Writeln(I^); 
    Readln; 
end. 

के बाद से एक स्थानीय के दायरे समारोह जिसमें यह परिभाषित किया गया है तक ही सीमित है, दृष्टिकोण ऊपर उल्लिखित ही संभव है: यहाँ एक उदाहरण है कि जानवर की संख्या मुद्रित करने के लिए एक नहीं बल्कि जटिल रास्ते पर ले जाता है उपाय।

+0

स्थानीय लेखन योग्य कॉन्स का जीवनकाल क्या है? जब तक कोड विधि को छोड़ देता है (सामान्य स्थानीय चर की तरह), या इसे साझा किया जाता है? पहले मामले में आपके कोड में अपरिभाषित व्यवहार है। – CodesInChaos

+1

@CodeInChaos यह वास्तव में विचित्र निर्माण है। वे वास्तव में वैश्विक चर हैं। स्थैतिक भंडारण के साथ सी स्थानीय लोगों के बराबर। –

+0

मैं उस तरह कुछ याद कर रहा था, लेकिन अब और यकीन नहीं था। – CodesInChaos