![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
увеличение дин.массива [D7]
вопрос © (2009-06-17 13:39:00)
var A:array of Byte;
begin
SetLength(A,1);
A[0]:=5;
// и тут вдруг я понял, что одного элемента мне не достаточно. Необходимо увеличить размер существующего массива.
end;
Мои мысли :
SetLength(A,2); // ячейка A[0] возможно разрушится
SetLength(A,A+1); // Error:Operator not applicable to this operand type
А как правильно пока не пойму ((
oldman (2009-06-17 20:30:00) [1]
> и тут вдруг я понял, что одного элемента мне не достаточно.
Вообще-то перед кодингом задачу надо анализировать. Вдумчиво.
В плане разработки на анализ выделяется время, учти.
Ega23 (2009-06-17 17:43:00) [2]
> А зачем ? Простой тест на "скорострельность" убедительно
> демонстрирует шустрость резервирования массива по единичке
> по сравнению, например, с добавлением строки в список (TStrings)
>
Пардон, как демонстрирует? И где тут "тормоза"?
procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject);
begin
Changing;
if FCount = FCapacity then Grow;
if Index < FCount then
System.Move(FList^[Index], FList^[Index + 1],
(FCount - Index) * SizeOf(TStringItem));
with FList^[Index] do
begin
Pointer(FString) := nil;
FObject := AObject;
FString := S;
end;
Inc(FCount);
Changed;
end;
Нат (2009-06-17 17:34:00) [3]Из-за дефрагментации памяти.
MsGuns (2009-06-17 17:24:00) [4]>Нат © (17.06.09 14:18) [8]
>Если действительно нужен выделяйте наиболее ожидаемое количество с запасом, например, на >10 элементов.
А зачем ? Простой тест на "скорострельность" убедительно демонстрирует шустрость резервирования массива по единичке по сравнению, например, с добавлением строки в список (TStrings)
sniknik (2009-06-17 16:19:00) [5]> стало после увеличения:
> 12345мммммм (м - "мусор")
значения динамических обьектов, массивов, строк инициализируются.
т.е. будет
12345000000
Нат (2009-06-17 14:18:00) [6]В целях уменьшения фрагментации памяти, рекомендуется выделять память блоками.
Нужен ли здесь динамический массив?
Если действительно нужен выделяйте наиболее ожидаемое количество с запасом, например, на 10 элементов.
{RASkov} (2009-06-17 14:03:00) [7]> [0] вопрос (17.06.09 13:39)
> Мои мысли :
> SetLength(A,2); // ячейка A[0] возможно разрушится
SetLength не изменяет содержимое динмассива, только его длинну...
т.е. если увеличиваем Length - то после имеющихся данных будет "мусор" (нули, nil'ы, '')
если уменьшаем, то просто обрезаются данные...
Было:
12345
стало после увеличения:
12345мммммм (м - "мусор")
или после уменьшения
123
Palladin (2009-06-17 13:45:00) [8]
> brother © (17.06.09 13:43) [4]
я сама доброта...
brother (2009-06-17 13:45:00) [9];)
brother (2009-06-17 13:43:00) [10]> Length + F1
добрее надо быть в начинающих ;)
вон в http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1245096963что творится))))
вопрос (2009-06-17 13:41:00) [11]Т.е.
SetLength(A,Length(A)+1);
спасибо
Palladin (2009-06-17 13:40:00) [12]Length + F1
brother (2009-06-17 13:40:00) [13]> ячейка A[0] возможно разрушится
проверь
> SetLength(A,A+1);
а так: SetLength(A,Sizeof(A)+1)