Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
Внизувеличение дин.массива Найти похожие ветки
← →
вопрос (2009-06-17 13:39) [0]
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
А как правильно пока не пойму ((
← →
Palladin © (2009-06-17 13:40) [1]Length + F1
← →
brother © (2009-06-17 13:40) [2]> ячейка A[0] возможно разрушится
проверь
> SetLength(A,A+1);
а так: SetLength(A,Sizeof(A)+1)
← →
вопрос (2009-06-17 13:41) [3]Т.е.
SetLength(A,Length(A)+1);
спасибо
← →
brother © (2009-06-17 13:43) [4]> Length + F1
добрее надо быть в начинающих ;)
вон в http://delphimaster.net/view/15-1245096963/ что творится))))
← →
Palladin © (2009-06-17 13:45) [5]
> brother © (17.06.09 13:43) [4]
я сама доброта...
← →
brother © (2009-06-17 13:45) [6];)
← →
{RASkov} © (2009-06-17 14:03) [7]> [0] вопрос (17.06.09 13:39)
> Мои мысли :
> SetLength(A,2); // ячейка A[0] возможно разрушится
SetLength не изменяет содержимое динмассива, только его длинну...
т.е. если увеличиваем Length - то после имеющихся данных будет "мусор" (нули, nil"ы, "")
если уменьшаем, то просто обрезаются данные...
Было:
12345
стало после увеличения:
12345мммммм (м - "мусор")
или после уменьшения
123
← →
Нат © (2009-06-17 14:18) [8]В целях уменьшения фрагментации памяти, рекомендуется выделять память блоками.
Нужен ли здесь динамический массив?
Если действительно нужен выделяйте наиболее ожидаемое количество с запасом, например, на 10 элементов.
← →
sniknik © (2009-06-17 16:19) [9]> стало после увеличения:
> 12345мммммм (м - "мусор")
значения динамических обьектов, массивов, строк инициализируются.
т.е. будет
12345000000
← →
MsGuns © (2009-06-17 17:24) [10]>Нат © (17.06.09 14:18) [8]
>Если действительно нужен выделяйте наиболее ожидаемое количество с запасом, например, на >10 элементов.
А зачем ? Простой тест на "скорострельность" убедительно демонстрирует шустрость резервирования массива по единичке по сравнению, например, с добавлением строки в список (TStrings)
← →
Нат © (2009-06-17 17:34) [11]Из-за дефрагментации памяти.
← →
Ega23 © (2009-06-17 17:43) [12]
> А зачем ? Простой тест на "скорострельность" убедительно
> демонстрирует шустрость резервирования массива по единичке
> по сравнению, например, с добавлением строки в список (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;
← →
oldman © (2009-06-17 20:30) [13]
> и тут вдруг я понял, что одного элемента мне не достаточно.
Вообще-то перед кодингом задачу надо анализировать. Вдумчиво.
В плане разработки на анализ выделяется время, учти.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c