Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

увеличение дин.массива [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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо