2012-07-13 13 views
45

में जेनेरिक और आगे की घोषणा का उपयोग करते समय कंपाइलर बग मैंने डेल्फी 2010 पर प्रोजेक्ट शुरू किया, फिर XE पर माइग्रेट किया और अब मैं XE2 पर माइग्रेट करने का प्रयास करता हूं। XE2 (अद्यतन 4 हॉटफिक्स 1) में संकलन के बाद, इकाई परीक्षण एवी के साथ विफल हो गया। कुछ डिबगिंग के बाद, यह स्पष्ट हो गया कि निम्नलिखित कोड सही तरीके से संकलित नहीं है:डेल्फी XE2

program ForwardDeclaration; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils; 

type 
    TEntityBase = class(TObject) 
    protected 
     FModel: Integer; 
    public 
     constructor Create(const AModel: Integer); 
    end; 

    TEntity<TKey> = class(TEntityBase) 
    end; 

    TMyEntity2 = class; 

    TMyEntity1 = class(TEntity<Integer>) 
     FData: Integer; 
    end; 

    TMyEntity2 = class(TMyEntity1) 
    end; 

constructor TEntityBase.Create(const AModel: Integer); 
begin 
    inherited Create; 
    FModel := AModel; 
end; 

var 
    MyEntity: TMyEntity1; 
begin 
    try 
     Writeln(TEntityBase.ClassName, ': ', TEntityBase.InstanceSize, ' bytes'); 
     Writeln(TMyEntity1.ClassName, ': ', TMyEntity1.InstanceSize, ' bytes'); 
     MyEntity := TMyEntity1.Create(100); 
     Assert(MyEntity.FData = 0); 
    except 
     on E: Exception do Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

कार्यक्रम आउटपुट:

TEntityBase: 12 bytes 
TMyEntity1: 12 bytes <-- Must be 16 bytes! 
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41) 

यह ट्यूनिंग संकलक विकल्प करके समस्या को हल करने के लिए संभव है?

क्या यह समस्या किसी और पर दोहराती है?

पीएस QC107110

+0

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

+0

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

+0

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

उत्तर

4

यह ट्यूनिंग संकलक विकल्प करके समस्या को हल करने के लिए संभव है?

नहीं, आप ट्यूनिंग द्वारा त्रुटि को ठीक नहीं किया जा सकता है, यह एक (बहुत विशिष्ट) संकलक में बग है।

[क्या कोई मुझे बता सकता है] क्या यह समस्या किसी और पर दोहराती है?

मैं कोड पुन: पेश कर सकते हैं, लेकिन केवल XE2 अद्यतन में 4.

मैं XE3 में यह जाँच करने के लिए (जो संस्करण नहीं है) में सक्षम नहीं था। यह XE4 में तय है (टिप्पणियों के अनुसार)।

एक:

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

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