Pergunta
eu tenho este código completo:
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.
Como saída, devo ter algo como:
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]
Mas eu tenho este resultado:
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]
Com este erro para terminar: EInvalidPointer: Operação inválida do ponteiro . O código é muito simples, mas não entendo onde me engano, ou o que me esqueci de acrescentar, para ter a saída que desejo. Obrigado novamente por quem me ajudou a resolver este problema, muito obrigado
Solução
Você está criando uma nova instância de MySubList e quase sempre a sobrescrevendo com um ponteiro para uma lista existente à qual você adiciona um novo item.Em vez disso, você precisa copiar os itens individualmente da lista anterior para a nova lista:
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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow