Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: 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 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
15-1159173745
megabyte-ceercop
2006-09-25 12:42
2006.10.22
Еще раз о траблах с линкером.


1-1157859656
Avgust
2006-09-10 07:40
2006.10.22
Delphi и word


2-1159690084
Rem02
2006-10-01 12:08
2006.10.22
InterBase Прошу помочь!!!


6-1148482475
Veetyok
2006-05-24 18:54
2006.10.22
иероглифы при чтении почты


2-1159884569
AlexeyT
2006-10-03 18:09
2006.10.22
"Полноэкранный режим" без установки BorderStyle