2012-02-18 2 views
-1

у меня есть этот полный код:Копирование Подсписок из списка

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. 

Как выход я должен иметь что-то как:

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] 

Но у меня есть этот результат:

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] 

С эта ошибка заканчивается: EInvalidPointer: Неверная операция указателя. Код очень прост, но не понимаю, где я ошибаюсь, или что я забываю добавить к нему, потому что у меня есть вывод, который я хочу. Еще раз спасибо за помощь, которая поможет мне решить эту проблему, очень многое

+0

-1 для чего не работает вопрос Codez Work. –

ответ

2

Вы создаете новый экземпляр MySubList, а затем почти всегда переписываете его указателем на существующий список, в который вы затем добавляете новый элемент. Вместо этого вам нужно скопировать элементы отдельно из предыдущего списка в новый список:

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; 
+1

+1, но также стоит сказать, что в списках просочились –

+0

Привет, спасибо, это решает проблему, но так все очень медленно :(Просто для того, чтобы сделать пример, если iindex1 нужно считать до 9000, а подсчет - 90 элементов, требуется примерно 15 секунд или больше. В общем, мне нужна работа с подспиской из тысячи элементов, и поэтому время очень непомерно, просто идея о том, как я могу решить эту проблему? Еще раз спасибо. –

+0

Marcello .... Я нахожу, что ваш тип вопроса расстраивает. Это похоже на то, что кто-то изобретает автомобиль и спрашивает механика, почему он не будет работать. Это ваш автомобиль. Ты написал каждую строку. Один шаг в отладчике и понять, что делает текущий код, или, если он не делает то, что вы хотите, начинайте все заново и продолжайте линию за строкой, пока он не сделает то, что вы хотите. Спросив, почему багги большой блок кода не делает то, что вы хотите, просит нас сделать фундаментальный акт мышления -значительно-осторожно, что и есть разработка программного обеспечения все о –

Смежные вопросы