2011-12-11 7 views
5

ऑब्जेक्ट पास्कल/डेल्फी में सी/सी ++ स्थैतिक स्थानीय चर की समान कार्यक्षमता प्राप्त करने का प्रयास कर रहा है। के सी में एक निम्न कार्य हो करते हैं:सही सी स्थिर स्थानीय चरणीय प्रतिस्थापन?

bool update_position(int x, int y) 
{ 
    static int dx = pow(-1.0, rand() % 2); 
    static int dy = pow(-1.0, rand() % 2); 

    if (x+dx < 0 || x+dx > 640) 
     dx = -dx; 
    ... 
    move_object(x+dx, y+dy); 
    ... 
} 

समतुल्य ObjectPascal कोड लिखा स्थिरांक का उपयोग कर एक स्थिर चर स्थानापन्न के रूप में संकलित करने के लिए विफल रहता है:

function UpdatePosition(x,y: Integer): Boolean; 
const 
    dx: Integer = Trunc(Power(-1, Random(2))); // error E2026 
    dy: Integer = Trunc(Power(-1, Random(2))); 
begin 
    if (x+dx < 0) or (x+dx > 640) then 
    dx := -dx; 
    ... 
    MoveObject(x+dx, y+dy); 
    ... 
end; 

[डीसीसी त्रुटि] test_f.pas (332): E2026 लगातार अभिव्यक्ति की उम्मीद

तो क्या एक बार के पास स्थानीय परिवर्तनीय प्रारंभ करने का कोई तरीका है?

+0

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

उत्तर

6

डेल्फी में सी स्थिर चर के बराबर कोई समकक्ष नहीं है।

एक लिखने योग्य टाइप स्थिर (user1092187's answer देखें) लगभग बराबर है। इसमें वही स्कोपिंग और इंस्टेंसिंग गुण हैं, लेकिन एक बार प्रारंभिक प्रारंभिकरण की अनुमति नहीं देता है जो सी या सी ++ स्थिर चर के साथ संभव है। किसी भी मामले में यह मेरी राय है कि लिखने योग्य टाइप किए गए स्थिरांक को एक विचित्र ऐतिहासिक फुटनोट के रूप में छोड़ा जाना चाहिए।

आप वैश्विक चर का उपयोग कर सकते हैं।

var 
    dx: Integer; 
    dy: Integer 

function UpdatePosition(x,y: Integer): Boolean; 
begin 
    if (x+dx < 0) or (x+dx > 640) then 
    dx := -dx; 
    ... 
    MoveObject(x+dx, y+dy); 
    ... 
end; 

आप initialization खंड में एक बार प्रारंभ करना है:

initialization 
    dx := Trunc(Power(-1, Random(2))); 
    dy := Trunc(Power(-1, Random(2))); 

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

type 
    TPosition = class 
    private class var 
    dx: Integer; 
    dy: Integer; 
    private 
    class constructor Create; 
    public 
    class function UpdatePosition(x,y: Integer): Boolean; static; 
    end; 

class constructor TPosition.Create; 
begin 
    dx := Trunc(Power(-1, Random(2))); 
    dy := Trunc(Power(-1, Random(2))); 
end; 

class function TPosition.UpdatePosition(x,y: Integer): Boolean; 
begin 
    // your code 
end; 
+0

Thx, डेविड। जैसा कि आपने उल्लेख किया है, वैश्विक अंतरिक्ष से बचने के लिए मैंने स्थानीय चर का उपयोग करने पर जोर दिया था। ऐप को ध्यान में लिखा थ्रेड-सुरक्षित होना चाहिए। शायद क्लास-रैपिंग वर्कअराउंड का उपयोग करने जा रहा है। –

+0

सी statics threadsafe नहीं हैं क्योंकि मुझे यकीन है कि आप जानते हैं। और क्लास-रैपिंग दृष्टिकोण थ्रेडसेफ भी नहीं होगा। आपको लॉकिंग या लॉक-फ्री कोडिंग के कुछ रूप की आवश्यकता होगी। –

+0

'वर्ग कन्स्ट्रक्टर TPosition.Create' और' क्लासिक '' कन्स्ट्रक्टर TPosition.Create' के बीच क्या अंतर है? –

4

सक्षम "Writable typed constants":

{$J+} 
procedure abc; 
const 
    II: Integer = 45; 

begin 
    Inc(II); 
    ShowMessage(IntToStr(II)); 
end; 
{$J-} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    abc; 
    abc; 
    abc; 
end; 
+0

यह वास्तव में काम करता है लेकिन प्रोजेक्ट वाइड कंपाइलर विकल्पों को करने के बजाय, ['{$ WRITEABLECONST}'] (http://docwiki.embarcadero.com/RADStudio/en/Writeable_typed_constants_ (डेल्फी)) निर्देश हमेशा पसंद किया जाएगा।वैसे ही, मैं इस विकल्प की थोड़ी संदिग्ध हूं क्योंकि यह सक्रिय होने पर सभी स्थिरांक स्थिर और लिखने योग्य बनाता है। –

+0

लिखने योग्य टाइप किए गए स्थिरांक के साथ क्या नहीं किया जा सकता है प्रश्न में कोड में किए गए प्रारंभिक प्रकार का प्रकार है। –

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