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

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

Динамический массив


Neket ©   (2006-10-04 12:49:00) 

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

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


zamtmn   (2006-10-04 19:28:00) [1]

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


Sapersky   (2006-10-04 17:57:00) [2]

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

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


MsGuns   (2006-10-04 17:02:00) [3]

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

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


Sapersky   (2006-10-04 16:23:00) [4]

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


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


zamtmn   (2006-10-04 15:40:00) [5]

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


Palladin   (2006-10-04 15:06:00) [6]


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

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

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

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


han_malign   (2006-10-04 14:41:00) [7]


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

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


Palladin   (2006-10-04 13:41:00) [8]


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

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


SergP.   (2006-10-04 13:20:00) [9]

> [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:00) [10]


> используй 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);


Neket   (2006-10-04 12:55:00) [11]

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

type

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

var

Mass:Array of Zapis;

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


Palladin   (2006-10-04 12:51:00) [12]

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


Наверх

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