XE8'e yükselttikten sonra bazı projelerimiz veriyi kırmaya başladı. TList realizasyonda bir hataya benziyor.TList <T>'daki Delphi XE8 hatası, geçici çözüm gerekiyor
program XE8Bug1;
{$APPTYPE CONSOLE}
uses
System.SysUtils, Generics.Collections;
type
TRecord = record
A: Integer;
B: Int64;
end;
var
FRecord: TRecord;
FList: TList<TRecord>;
begin
FList := TList<TRecord>.Create;
FRecord.A := 1;
FList.Insert(0, FRecord);
FRecord.A := 3;
FList.Insert(1, FRecord);
FRecord.A := 2;
FList.Insert(1, FRecord);
Writeln(IntToStr(FList[0].A) + IntToStr(FList[1].A) + IntToStr(FList[2].A));
end.
Bu kod yazdırılır XE7 içinde "123" ve daha önce (olması gerektiği gibi), ancak XE8 o "120" basar. Belki birisi bunun için bir ipucu biliyor mu?
Güncelleme:
procedure TListHelper.InternalInsertN(AIndex: Integer; const Value);
var
ElemSize: Integer;
begin
CheckInsertRange(AIndex);
InternalGrowCheck(FCount + 1);
ElemSize := ElSize;
if AIndex <> FCount then
Move(PByte(FItems^)[AIndex * ElemSize], PByte(FItems^)[(AIndex * ElemSize) + 1], (FCount - AIndex) * ElemSize);
Move(Value, PByte(FItems^)[AIndex * ElemSize], ElemSize);
Inc(FCount);
FNotify(Value, cnAdded);
end;
İlk Move
sorunu bkz: resmi olmayan düzeltme here
jenerik koleksiyonları XE8 yeniden uygulanmıştır. Belki de Emba'da herhangi bir birim testi yoktur. Tanımladığınız buysa ve çözüm muhtemelen XE7'de kalmaktır. Bir hata raporu göndermeniz gerekiyor. –
[Regression: TList .Insert çalışmıyor] olarak bildirildi (https://quality.embarcadero.com/browse/RSP-10773). –
Yani Embarcadero'nun etkili bir test rejimi yok gibi görünüyor. Yeryüzünde bu yanlış nasıl olabilir? Böyle temel bir sınıf. İyi çalışan bir dev ekibin birimi kapsamlı bir şekilde test ederdi. Böyle bir hata asla bu testi geçmemelidir. Kasvetli. –