Форум: "Начинающим";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];
Вниззаполнить список nil Найти похожие ветки
← →
Дмитрий (2011-05-06 17:01) [0]у меня есть одномерный массив (FArrayLinkers) размера N. Нужно создать список объектов - TObjectList такого же размера как и массив, каждому айтему присвоив - nil. Сейчас это делаю в цикле. Это правильно или можно как-то иначе?
FLinkerItems := TObjectList.Create;
for I := Low(FArrayLinkers) to High(FArrayLinkers)
FLinkerItems.Add(nil);
← →
RWolf © (2011-05-06 17:10) [1]
FLinkerItems := TObjectList.Create;
FLinkerItems.Count:=N;
← →
Ega23 © (2011-05-06 17:24) [2]
> RWolf © (06.05.11 17:10) [1]FLinkerItems.Count:=N;
неправда твоя, там не nil будет, там будет неизвестно что.
← →
Ega23 © (2011-05-06 17:28) [3]
> Это правильно или можно как-то иначе?
По-идее быстрее будетlist.Count := N;
for i := 0 to N - 1 do
list[i] := nil;
Хотя тут чёрт его знает. Тестить надо.
← →
RWolf © (2011-05-06 17:31) [4]
> Ega23 © (06.05.11 17:24) [2]
> неправда твоя, там не nil будет, там будет неизвестно что.
Цитата из хелпа D7:Increasing the size of Count will add the necessary number of nil (Delphi) or NULL (C++) pointers to the end of the Items array.
← →
Palladin © (2011-05-06 17:33) [5]
ZeroMemory(list.List^, list.Count * SizeOf(Pointer));
)
← →
Palladin © (2011-05-06 17:34) [6]твоя правда
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
for I := FCount - 1 downto NewCount do
Delete(I);
FCount := NewCount;
end;
← →
Ega23 © (2011-05-06 17:34) [7]
> Цитата из хелпа D7:
> Increasing the size of Count will add the necessary number
> of nil (Delphi) or NULL (C++) pointers to the end of the
> Items array.
D2010
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
Temp: Pointer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount <> FCount then
begin
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
if ClassType <> TList then
begin
for I := FCount - 1 downto NewCount do
begin
Dec(FCount);
Temp := List^[I];
if Temp <> nil then
Notify(Temp, lnDeleted);
end;
end;
FCount := NewCount;
end;
end;
procedure TList.SetCapacity(NewCapacity: Integer);
begin
if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then
Error(@SListCapacityError, NewCapacity);
if NewCapacity <> FCapacity then
begin
ReallocMem(FList, NewCapacity * SizeOf(Pointer)); // Вот оно
FCapacity := NewCapacity;
end;
end;
← →
Ega23 © (2011-05-06 17:35) [8]А, да. Не увидел
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
Был неправ, прошу прощения.
← →
Palladin © (2011-05-06 17:35) [9]
> Ega23 © (06.05.11 17:34) [7]
не заметил )if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
← →
RWolf © (2011-05-06 17:36) [10]
> Ega23 © (06.05.11 17:34) [7]
ну так обнуляет же,
сначала вызывается SetCapacity(NewCount), потом FillChar.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c