Вниз
Скачать: CL | DM;

Динамический массив   Найти похожие ветки 

← →
Neket   (2006-10-04 12:49) [0]

Подскажите как создать и работать (Добавлять, изменять, удалять) динамический массив Записей? Т.е.
Создается запись с именем ZAPIS с полями:
Pole1;
Pole2;
Pole3;

И в процессе работы программы необходимо добавлять в массив новые данные.


← →
Palladin ©   (2006-10-04 12:51) [1]

используй TList, он все сделает за тебя


← →
Neket   (2006-10-04 12:55) [2]

Т.е. Програмно можно описать примерно так:

type

Zapis = packed record
pole1: string;
pole1:string;
pole1:string;
end;

var

Mass:Array of Zapis;

Если я буду работать именно таким образом то будет ли это работать нормально если Да то как именно с этим можно работать, или есть другой способ то какой и подскажите на примерер пожалуйста.
Заранее благодарен.


← →
SergP.   (2006-10-04 13:20) [3]

> [2] Neket   (04.10.06 12:55)
> Т.е. Програмно можно описать примерно так:
>
> type
>
> Zapis = packed record
> pole1: string;
> pole1:string;
> pole1:string;
> end;
>
> var
>
> Mass:Array of Zapis;
> Если я буду работать именно таким образом то будет ли это
> работать нормально если Да то как именно с этим можно работать,
> или есть другой способ то какой и подскажите на примерер
> пожалуйста.
> Заранее благодарен.


А почему бы этому не работать? Все зависит от дальнейшей реализации...
Если правильно сделаешь, то все будет работать. Правда для эффективной работы придется учесть много ньюансов.
Хотя можно почитать [1] и придется меньше заморачивать голову всякими мелочами...


← →
han_malign ©   (2006-10-04 13:20) [4]


> используй TList, он все сделает за тебя

- кроме New и Dispose...


> Mass:Array of Zapis;
> Если я буду работать именно таким образом то будет ли это работать нормально

SetLength(Mass, 17);
for i:= Low(Mass) to High(Mass) do Mass[i].pole1:= "Hello World " + IntToStr(i);
...........
Mass1:= Mass2;//копируется ссылка
Mass1[3]:= "Good-bye World";//Mass[3] - тоже принимает значение "Good-bye World"
...........
Mass2:= Copy(Mass, 2, 3);//копия, Mass2 не зависит от Mass, и наоборот
Mass:= nil;// <==> SetLength(Mass, 0) - явное освобождение памяти
for i:= Low(Mass2) to High(Mass2) do ShowMessage(Mass[i].pole1);


← →
Palladin ©   (2006-10-04 13:41) [5]


> - кроме New и Dispose...

какой ужас...


← →
han_malign ©   (2006-10-04 14:41) [6]


> какой ужас...

- в этом конкретном случае, особенно если не нужно вставлять/удалять элементы в произвольных позициях - как раз compiler magic динамического массива все сделает за него, а TList нет...


← →
Palladin ©   (2006-10-04 15:06) [7]


> как раз compiler magic динамического массива все сделает
> за него

что именно он сделает за него такого чего не сделает TList? сам память выделит и/или освободит под запись и все?

а сколько нужно реализовывать вставку/удаление элемента?
а сколько раз перелопачивать большие куски памяти при этом, в случае большого количества записей?
а при ожидаемом небольшом количестве элементов зачем нужны эти телодвижения?

динамический массив оптимально пригоден лишь при довольно станционарном хранении довольно большого набора данных с наиминимальнейшими телодвижениями по вставке/удалению (во время работы конечно)


← →
zamtmn ©   (2006-10-04 15:40) [8]

с TList получится массив ссылок на Zapis а не массив Zapis


← →
Sapersky   (2006-10-04 16:23) [9]

а сколько нужно реализовывать вставку/удаление элемента?
а сколько раз перелопачивать большие куски памяти при этом, в случае большого количества записей?


Вообще-то есть по крайней мере одна универсальная (хотя и не идеальная) библиотека:
http://rsdn.ru/article/Delphi/dynarrays.xml
(для D6 и далее).
У меня есть вариант, который работает в D5 и перевыделяет память блоками (не по одному элементу).
Насчёт перелопачивать куски - да, при частой вставке/удалении из середины TList быстрее. Но если не важен порядок элементов, можно вместо сдвига "хвоста" копировать последний элемент на место удаляемого. В этом случае (и при добавлении только в конец) массив быстрее - нет накладных расходов на выделение/освобождение памяти для элементов.
Опять же, ИМХО, большое преимущество массива - элементы видно при отладке, если навести курсор...


← →
MsGuns ©   (2006-10-04 17:02) [10]

>zamtmn ©   (04.10.06 15:40) [8]
>с TList получится массив ссылок на Zapis а не массив Zapis

с двумя разницами:
1. TList - это не массив
2. Zapis - это не массив


← →
Sapersky   (2006-10-04 17:57) [11]

1. TList - это не массив

Т.н. линейный список, который суть массив указателей :)


← →
zamtmn ©   (2006-10-04 19:28) [12]

>>с двумя разницами:
>>1. TList - это не массив
TList это массив указателей, в данном случае на Zapis
>>2. Zapis - это не массив
Mass:Array of Zapis - это массив элементов типа Zapis



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.032 c
4-1149788245
Steplerr
2006-06-08 21:37
2006.10.22
С консолью через хендл


2-1160053115
Anto}{a
2006-10-05 16:58
2006.10.22
Таблица


2-1160388362
SamProf
2006-10-09 14:06
2006.10.22
Как сделать запрос IdHTTP.Get(<url>) методом POST в 10 Indy?


2-1159861190
XTD
2006-10-03 11:39
2006.10.22
Сохранение listBox в файл.


11-1136052803
Boguslaw
2005-12-31 21:13
2006.10.22
AncestorOfObject




   Наверх