में जेनेरिक और आगे की घोषणा का उपयोग करते समय कंपाइलर बग मैंने डेल्फी 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
इसे गुणवत्ता केंद्र में सबमिट करें। इसके अलावा, आगे की घोषणाएं कहां आती हैं। ऐसी ही घोषणा का उपयोग नहीं किया जाता है। –
कोड सबसे सरल है, इसलिए संकलक त्रुटि को पुन: उत्पन्न किया गया था। एक असली परियोजना में आगे की घोषणाओं का उपयोग किया जाता है। अगर यह समस्या न केवल मुझ पर है, तो मैं क्यूसी को लिखता हूं। – Chaa
ठीक है। जब आप बग सबमिट करते हैं तो आपको इसे और भी नीचे पट्टी करनी चाहिए। ऐसा लगता है कि आगे की घोषणा प्रासंगिक नहीं है। InstanceSize के साथ बस एक कोडेजन समस्या। यदि आपके पास समर्थन अनुबंध है तो आप एक समर्थन समस्या खोल सकते हैं हालांकि ऐसा करने का अर्थ यह भी नहीं है कि आपको एक प्रतिक्रिया मिलेगी। –