Copier sublist de la liste
-
27-10-2019 - |
Question
J'ai ce code complet:
program List;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils,
Generics.Collections;
type
TMySubList = TList<Integer>;
TMyList = TObjectList<TMySubList>;
var
iIndex1, iIndex2: Integer;
MyList: TMyList;
MySubList: TMySubList;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
MyList := TMyList.Create;
try
for iIndex1 := 1 to 10 do
begin
MySubList := TList<Integer>.Create;
if MyList.Count <> 0 then MySubList := MyList.Last;
MySubList.Add(iIndex1);
MyList.Add(MySubList);
end;
for iIndex1 := 0 to pred(MyList.Count) do
begin
for iIndex2 := 0 to pred(MyList[iIndex1].Count) do write(MyList[iIndex1][iindex2]:5);
writeln;
end;
finally
MyList.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
En sortie je devrais avoir quelque chose comme:
1 // MyList[0]
1 2 // MyList[1]
1 2 3 // MyList[2]
1 2 3 4 // MyList[3]
1 2 3 4 5 // MyList[4]
1 2 3 4 5 6 // MyList[5]
1 2 3 4 5 6 7 // MyList[6]
1 2 3 4 5 6 7 8 // MyList[7]
1 2 3 4 5 6 7 8 9 // MyList[8]
1 2 3 4 5 6 7 8 9 10 // MyList[9]
Mais je dois ce résultat:
1 2 3 4 5 6 7 8 9 10 // MyList[0]
1 2 3 4 5 6 7 8 9 10 // MyList[1]
1 2 3 4 5 6 7 8 9 10 // MyList[2]
1 2 3 4 5 6 7 8 9 10 // MyList[3]
1 2 3 4 5 6 7 8 9 10 // MyList[4]
1 2 3 4 5 6 7 8 9 10 // MyList[5]
1 2 3 4 5 6 7 8 9 10 // MyList[6]
1 2 3 4 5 6 7 8 9 10 // MyList[7]
1 2 3 4 5 6 7 8 9 10 // MyList[8]
1 2 3 4 5 6 7 8 9 10 // MyList[9]
Avec cette erreur à la fin: EInvalidPointer: pointeur non valide l'opération . Le code est beaucoup plus simple, mais pas à comprendre où je me trompe, ou ce que j'oublie d'ajouter, pour avoir la sortie que je veux. Merci encore pour qui me aider à résoudre ce problème, très
La solution
Vous créez une nouvelle instance de MySubList et presque toujours avec un écrasant pointeur sur une liste existante que vous ajoutez ensuite un nouvel élément à. Au lieu de cela, vous devez copier les éléments individuellement dans la liste précédente dans la nouvelle liste:
for iIndex1 := 1 to 10 do
begin
MySubList := TList<Integer>.Create;
if MyList.Count <> 0 then begin
for iIndex2 := 0 to MyList.Last.Count-1 do
MySubList.Add(MyList.Last[iIndex2]);
end;
MySubList.Add(iIndex1);
MyList.Add(MySubList);
end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow