2015-06-29 4 views
5

एम्बरकाडेरो का डॉक्विकी पेज LLVM-based Delphi Compilers डेल्फी XE8 में कई भाषा परिवर्तनों को सूचीबद्ध करता है। गोलियों में से एक कहते हैं:डेल्फी XE8 के मोबाइल कंपाइलर्स में कौन सी पॉइंटर-संबंधित चीजें काम नहीं करती हैं?

पॉइंटर्स का उपयोग एलएलवीएम-आधारित डेल्फी कंपाइलर्स द्वारा समर्थित नहीं है।

अभ्यास में इसका क्या अर्थ है? डेल्फी एक्सई 7 में काम करने के लिए उपयोग की जाने वाली पॉइंटर से संबंधित चीजें, अब डेल्फी एक्सई 8 में काम नहीं करतीं? मुझे Embarcadero की वेबसाइट पर इस पर गहराई से स्पष्टीकरण नहीं मिल रहा है। पृष्ठ Migrating Delphi Code to Mobile from Desktop जिसमें अधिक जानकारी शामिल है, उदाहरण के लिए "पॉइंटर" शब्द का उल्लेख नहीं है।

+0

मुझे पता चला है कि आप 'टैग' संपत्ति में पॉइंटर्स को स्टोर नहीं कर सकते हैं, या सामान्य रूप से' मूल 'में। कम से कम आईओएस और शायद एंड्रॉइड पर भी नहीं। मैं इस के लिए एक पूरी तरह से फिर से डिजाइन धन्यवाद के बीच में हूं, और तथ्य यह है कि सब कुछ * विंडोज के तहत बस ठीक काम कर रहा था। मूर्खतापूर्ण सूची सूचीओं पर संदर्भों को संग्रहीत करने के रूप में सरल कुछ कैसे मुझे एक पूरी तरह से अलग सूची प्रबंधक (एक 'TListView'/'TListViewItem' के लिए) लिखने की आवश्यकता है। –

+2

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

+0

@ डेविड यह मेरा मुद्दा है, 'TListViewItem.Tag' प्रॉपर्टी मुझे पॉइंटर्स को ऑब्जेक्ट्स रखने के लिए इसका उपयोग करने की अनुमति नहीं दे रही है, जैसा वीसीएल में संभव था। खैर कम से कम मैं इसमें से एक स्टोर कर सकता हूं, लेकिन मुझे इसे वापस करने की अनुमति नहीं देगा। मैंने देखा है कि कई अन्य लोगों को सटीक मुद्दे का सामना करना पड़ता है। उदाहरण के लिए देखें: http://codeverge.com/embarcadero.delphi।फायरमोनकी/अटैचिंग-यूजर-डेटा-टू-टिस्कीवी/1 9 88307 –

उत्तर

5

पॉइंटर्स का उपयोग एलएलवीएम-आधारित डेल्फी कंपाइलर्स द्वारा समर्थित नहीं है।

यह दस्तावेज़ में एक त्रुटि होना है। बस आरटीएल पर एक नज़र डालें। यह पॉइंटर्स के उपयोग के साथ मोटी है।

उदाहरण के लिए, CompareMem के बारे में कैसे। यह इस तरह से परिभाषित किया गया है:

function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; 

और कार्यान्वयन इस तरह से चलाता है:

function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; 
{$IF defined(POSIX)} 
begin 
    if Length <= 0 then 
    Result := True 
    else 
    Result := memcmp(P1^, P2^, Length) = 0; 
end; 
{$ELSEIF defined(PUREPASCAL)} 
.... 
{$ENDIF !PUREPASCAL} 

POSIX कोड मोबाइल लक्ष्यों द्वारा प्रयोग किया जाता है।

या कैसे के बारे में TObject जो इस तरह दिखता है:

type 
    TObject = class 
    public 
    constructor Create; 
    procedure Free; 
    procedure DisposeOf; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF} 
    class function InitInstance(Instance: Pointer): TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF}; 
    procedure CleanupInstance; 
    function ClassType: TClass; inline; 
    class function ClassName: string; 
    class function ClassNameIs(const Name: string): Boolean; 
    class function ClassParent: TClass; 
    class function ClassInfo: Pointer; inline; 
    class function InstanceSize: Integer; inline; 
    class function InheritsFrom(AClass: TClass): Boolean; 
    class function MethodAddress(const Name: _ShortStr): Pointer; overload; 
    class function MethodAddress(const Name: string): Pointer; overload; 
    class function MethodName(Address: Pointer): string; 
    class function QualifiedClassName: string; 
    function FieldAddress(const Name: _ShortStr): Pointer; overload; 
    function FieldAddress(const Name: string): Pointer; overload; 
    function GetInterface(const IID: TGUID; out Obj): Boolean; 
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; 
    class function GetInterfaceTable: PInterfaceTable; 
    class function UnitName: string; 
    class function UnitScope: string; 
{$IFDEF AUTOREFCOUNT} 
    function __ObjAddRef: Integer; virtual; 
    function __ObjRelease: Integer; virtual; 
{$ENDIF} 
    function Equals(Obj: TObject): Boolean; virtual; 
    function GetHashCode: Integer; virtual; 
    function ToString: string; virtual; 
    function SafeCallException(ExceptObject: TObject; 
     ExceptAddr: Pointer): HResult; virtual; 
    procedure AfterConstruction; virtual; 
    procedure BeforeDestruction; virtual; 
    procedure Dispatch(var Message); virtual; 
    procedure DefaultHandler(var Message); virtual; 
    class function NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF}; virtual; 
    procedure FreeInstance; virtual; 
{$IFDEF AUTOREFCOUNT} 
    protected 
{$ENDIF} 
    destructor Destroy; virtual; 

{$IFDEF CPP_ABI_SUPPORT} 
    procedure CPP_ABI_1; virtual; 
    procedure CPP_ABI_2; virtual; 
    procedure CPP_ABI_3; virtual; 
{$ENDIF !CPP_ABI_SUPPORT} 

    protected 
    function GetDisposed: Boolean; inline; 
    procedure CheckDisposed; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF} 

{$IFDEF AUTOREFCOUNT} 
    private const 
    objDestroyingFlag = Integer($80000000); 
    objDisposedFlag = Integer($40000000); 
    protected 
    [Volatile] FRefCount: Integer; 
    class procedure __MarkDestroying(const Obj); static; inline; 
    class function __SetDisposed(const Obj): Boolean; static; inline; 
    public 
    property RefCount: Integer read FRefCount; 
{$ENDIF} 
    property Disposed: Boolean read GetDisposed; 
    end; 

यह बहुत स्पष्ट है कि संकेत दिए गए मोबाइल प्लेटफार्मों पर यहां इस्तेमाल कर रहे हैं।

विषय पर एम्बरकेडेरो व्हाइटपेपर का एक पठन है: The Delphi Language for Mobile Development। फिर यह कई अवसरों पर पॉइंटर्स के उपयोग को शामिल करता है और यह स्पष्ट है कि वे समर्थित हैं। अब, यह भी सच है कि पॉइंटर्स का उपयोग निराश हो जाता है और यदि पॉइंटर्स आसानी से टाला जा सकता है तो आपको ऐसा करने के लिए प्रोत्साहित किया जाता है। लेकिन यह बताते हुए काफी अलग है कि पॉइंटर्स को कंपाइलर्स द्वारा समर्थित नहीं किया जाता है।

ऐसा लगता है कि कम से कम हल्के से विडंबनापूर्ण है कि एम्बरकेडेरो अपने उत्पादों के एफयूडी फैल रहे हैं।

+6

पीडीएफ से: 'पॉइंटर उपयोग को कम या हटा दें, पॉइंटर के प्रत्यक्ष उपयोग को निराश किया जा रहा है क्योंकि हम कुछ स्वचालित मेमोरी प्रबंधन की ओर बढ़ते हैं। जेनेरिक कंटेनर कक्षाओं का उपयोग करना, टीएलआईस्ट (आंतरिक रूप से पॉइंटर्स पर आधारित) के बजाय माइग्रेशन का एक अच्छा उदाहरण है कि डेल्फी आरटीएल लाइब्रेरी चल रही है, और हम सुझाव देते हैं कि डेल्फी डेवलपर उनके कोड में समान रूपांतरण भी करते हैं। –

+0

और : 'यूनिट जेनेरिक। कोलेक्शन में परिभाषित जेनेरिक कंटेनर क्लासेस का उपयोग करें। पुरानी शैली कंटर्स यूनिट मोबाइल प्लेटफ़ॉर्म पर उपलब्ध नहीं है, क्योंकि यह सूचक सूची (गैर-जेनेरिक टीएलआईस्ट क्लास) पर आधारित है और एआरसी मेमोरी प्रबंधन मॉडल के साथ ठीक से काम नहीं करेगा। '। और 'किसी भी पॉइंटर-आधारित संरचना और विधि से बचें, जब तक कि आप देशी एपीआई को कॉल करने की आवश्यकता न दें। '। –

+0

@LURD कोई सिर्फ 'TList = TList ' कर सकता है !!!! –

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