![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
добавить элемент в динамический массив в начало и в конец [D7, WinXP]
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.