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

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

добавить элемент в динамический массив в начало и в конец [D7, WinXP]


Страницы:   1 2

Delphi5.01 ©   (2006-03-20 02:46:00) 

Доброе время суток,
Есть ли способ который позволил бы добавить элемент в динамический массив в начало и в конец, не повреждая все остальные элементы, типа имеем
var
 myArray: array of byte;
begin
 SetLength(myArray, 3);
 myArray[0] := 1;
 myArray[1] := 2;
 myArray[2] := 3;
 //на данный момент массив содержит элементы [1, 2, 3]
end;

что надо сделать что бы массив стал содержать 4 элемента и новый элемент добавился или в начало или в конец соответственно
[new, 1, 2, 3] и [1, 2, 3, new]
как сделать в РНР или в Java я знаю а вот как с дельфи проблемы
Заранее благодарен за помощь
п.с. Прошу банальные варианты с увеличением размера массива и циклом перемещение всех элементов на одну позицию не предлагать


Yanis   (2006-03-20 09:22:00) [21]


> Что значит именно "реаллокацию", по идее оно должно повлечь
> потерю содержимого массива, так?

Нет. Что мешает проверить?


> И вообще как массив устроен в Delphi?

В интернете про это есть статьи. Вот что в справке (!) к стати написано: Dynamic array types
A dynamic-array variable occupies four bytes of memory which contain a pointer to the dynamically allocated array. When the variable is empty (uninitialized) or holds a zero-length array, the pointer is nil and no dynamic memory is associated with the variable. For a nonempty array, the variable points to a dynamically allocated block of memory that contains the array in addition to a 32-bit length indicator and a 32-bit reference count. The table below shows the layout of a dynamic-array memory block.

Dynamic array memory layout  
Offset Contents
-8 32-bit reference-count
-4 32-bit length indicator (number of elements)
0..Length * (size of element) - 1 array elements


Delphi5.01   (2006-03-20 05:48:00) [22]

Для помещения в конец никакого Move и цикла, разумеется, не нужно. "Банальный" SetLength и запись в последний элемент. Учти, что вызов SetLength в любом случае повлечет за собой реаллокацию памяти под массив.
Что значит именно "реаллокацию", по идее оно должно повлечь потерю содержимого массива, так? если да то SetLength не поможет, я об этом подумал правда пока не про экспериментировал :-)

Что касается move вот это уже интересно, а насколько он быстрей банального цикла, если он на уровне памяти и поинтеров работает то все ок если нет то не вижу смысла.

Большое вам спасибо за уделенное время

И вообще как массив устроен в Delphi? вот уже больше 5 лет под него программирую а вопрос только сейчас возник (был и раньше но не так обращал внимание).

Заранее благодарен.


Джо   (2006-03-20 02:56:00) [23]

Для помещения в конец никакого Move и цикла, разумеется, не нужно. "Банальный" SetLength и запись в последний элемент. Учти, что вызов SetLength в любом случае повлечет за собой реаллокацию памяти под массив.


Джо   (2006-03-20 02:51:00) [24]

> п.с. Прошу банальные варианты с увеличением размера массива
> и циклом перемещение всех элементов на одну позицию не предлагать

Не обязательно циклом. Можно при помощи Move.


Страницы:   1 2

Наверх

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