Domanda

Ho questo codice 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.

Come output dovrei avere qualcosa come:

 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]

Ma ho questo risultato:

 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]

Con questo errore alla fine: EinvalidPointer: operazione di puntatore non valido. Il codice è molto semplice ma non capisco dove sbaglio o cosa dimentico di aggiungere ad esso, perché ho l'output che voglio. Grazie ancora per chi mi aiuta a risolvere questo problema, molto

È stato utile?

Soluzione

Stai creando una nuova istanza di MySublist e poi quasi sempre sovrascrivendolo con un puntatore a un elenco esistente a cui si aggiunge un nuovo elemento. Invece è necessario copiare gli elementi individualmente dall'elenco precedente nel nuovo elenco:

  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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top