Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

увеличение дин.массива   Найти похожие ветки 

 
вопрос   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
15-1245044573
blurcode
2009-06-15 09:42
2009.08.16
Срубил меня остеохондроз, видимо.


15-1245468521
sl8er
2009-06-20 07:28
2009.08.16
Нахождение полинома Жегалкина для булевой функции


2-1245417227
iterator
2009-06-19 17:13
2009.08.16
Как обратиться к объекту?


2-1245139484
a.a.j.
2009-06-16 12:04
2009.08.16
EmbeddedWB и PNG


2-1245537180
Нойвам
2009-06-21 02:33
2009.08.16
Обработка чекбоксов