Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

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

 
Alek_1   (2004-05-17 13:15) [0]

как работать с сабжем?


 
WebErr ©   (2004-05-17 13:19) [1]

array + F1
SetLength + F1
В общем просто устанавливаешь нужное количество элементов массива по ходу выполнения программы с помощью SetLength


 
Alek_1   (2004-05-17 13:21) [2]

а как например удалять ненужный участок масива?

например есть у меня масив на 10 значений и мне нужно удалить только пятый, так чтобы все остальное осталось.


 
WebErr ©   (2004-05-17 13:28) [3]

Создаёшь другой дин. масив, устанавливаешь у него длину на 1 меньше, чем у твоего массива, копируешь в него кусок до 5-го элемента (от 1-го до 4-го) с помошью функции Copy, копируешь после пятого. Всё - нужный массив получен.


 
Alek_1   (2004-05-17 13:33) [4]

спасибо!


 
TUser ©   (2004-05-17 13:53) [5]


> Создаёшь другой дин. масив, устанавливаешь у него длину
> на 1 меньше, чем у твоего массива, копируешь в него кусок
> до 5-го элемента (от 1-го до 4-го) с помошью функции Copy,
> копируешь после пятого. Всё - нужный массив получен.

А если элементов будет 1e5 - тогда тоде второй массив делать?
Надо так
for i:=5 to 8 do
  ar[i]:=ar[i+1]; // или copyMemory, пошустрее будет
setLength(ar,9);


 
WebErr ©   (2004-05-17 14:00) [6]


> TUser ©   (17.05.04 13:53) [5]

Согласен :)


 
Fredericco ©   (2004-05-17 16:38) [7]

Дополню TUser ©   (17.05.04 13:53) [5]

for i:=5 to High(Ar) do
 Ar[i]:=Ar[i+1];
SetLength(Ar,High(Ar));


 
Fredericco ©   (2004-05-17 16:39) [8]

Дополню TUser ©   (17.05.04 13:53) [5]

for i:=5 to High(Ar) do
 Ar[i]:=Ar[i+1];
SetLength(Ar,High(Ar));


 
evvcom ©   (2004-05-17 16:50) [9]

Если удаляемый элемент содержит другие динамические струтуры, то сначала удалить их, потом Move, а потом SetLength. Самый оптимальный способ. Возражения есть?


 
default ©   (2004-05-17 16:57) [10]

evvcom ©   (17.05.04 16:50) [9]
не хочется проверять, но внутри SetLength-а сначала Move и делается, наверно(если не последний элемент удаляется, не в курсе если удаляется первый элемент указатель массива смещается на размер элемента или всё же с Move-ом работают...)


 
Anatoly Podgoretsky ©   (2004-05-17 17:06) [11]

Fredericco ©   (17.05.04 16:38) [7]
Однако выход за пределы массива
Ar[i]:=Ar[i+1];


 
evvcom ©   (2004-05-17 17:09) [12]


> внутри SetLength-а сначала Move и делается, наверно(если
> не последний элемент удаляется, не в курсе если удаляется
> первый элемент

А как это в SetLength указать какой именно элемент удалять? Интересное заявление! Обрезается всегда хвост.


 
VLAD-MAL   (2004-05-17 17:14) [13]

А как это в SetLength указать какой именно элемент удалять? Интересное заявление! Обрезается всегда хвост.

 Ну, дык - сначала ж Move... От "хвоста" к "дырке" - в результате "дырка" в "хвост" перемещается. А затем - SetLength, и "дырявый" "хвост" - кирдык.


 
default ©   (2004-05-17 17:17) [14]

evvcom ©   (17.05.04 17:09) [12]
да
VLAD-MAL   (17.05.04 17:14) [13]
я тоже сначала почему-то так подумал)


 
default ©   (2004-05-17 17:22) [15]

VLAD-MAL   (17.05.04 17:14) [13]
естественно подобную надстройку через SetLength и самому можно сделать, единственное неудобство: к примеру удаляемя третий элемент всего их 1000000 да ещё немаленького размера элементы
неплохо было бы скопировать первые два элемента на размер элемента правее и сместить указатель на тот же размер, и освободить память под первый элемент, но таково, наверно, не сделать(естест-но очень просто написать класс раб-ий по такой схеме)


 
VLAD-MAL   (2004-05-17 17:32) [16]

Ребятки, я недавно прочитал забавную книжку:

Фундаментальные алгоритмы и структуры данных в Delphi, Бакнелл.

http://www.books.ru/shop/books/96683?partner=yt

Может, кто еще не читал, купите - там описаны всякие смешные штуки, типа, как на Delphi лучше сделать свои динамические массивы, стеки, деки, очереди, деревья, алгоритмы кэширования/хэшировани/сжатия/сортировки. Я во время чтения испытывал состояние, как кот в процессе поедания сметаны.


 
Курдль ©   (2004-05-17 17:44) [17]

Самое забавное, что в 90% случаев начинающие программисты задают вопросы о динамическом массиве, смутно себе представляя, зачем он им нужен.
Я тоже слабо это представляю. В 99% моих задач такой необходимости не возникает. Разве что получить (передать) длинные данные из какой-нить затченной под динамический массив внешней функции.
Во всех других случаях гораздо легче и приятнее работать со списками, списками объектов, списками интерфейсов и коллекциями. (Не следует забывать о преимуществах ООП!)


 
VLAD-MAL   (2004-05-17 17:56) [18]

Курдль ©   (17.05.04 17:44) [17]

Ну, например, создаем в локальном массиве образ Excel - отчета, потом одним движением мысли выливаем его в Range - ну и как тут без Subj? Через коллекции?


 
Курдль ©   (2004-05-17 18:00) [19]

А что есть "образ Excel - отчета"?
Это набор записей, которые, скорее всего, представляют из себя смесь типов. Вот тебе и "список записей"! Т.е. List Record-ов!


 
Palladin ©   (2004-05-17 18:55) [20]


>  Курдль ©   (17.05.04 18:00)

Самое забавное, что недалекие от начинающих программистов, программисты довольно забавны в своем стремлении позабавится над чуть "младшими" коллегами.

Что быстрее?
Array of Extended;
или
TList; // of PExtended


 
TUser ©   (2004-05-17 20:24) [21]


> Самое забавное, что в 90% случаев начинающие программисты
> задают вопросы о динамическом массиве, смутно себе представляя,
> зачем он им нужен.

Я вот начинающий программист, все мои проги (ну или почти все) используют дин. массивы. Потому что, как правило, количество исходных данных неизвестно.


 
Palladin ©   (2004-05-17 20:29) [22]

А разве его кто-то назвал? :)


 
Vlad ©   (2004-05-17 20:37) [23]


> Курдль ©   (17.05.04 18:00) [19]


> А что есть "образ Excel - отчета"?
> Это набор записей, которые, скорее всего, представляют из
> себя смесь типов. Вот тебе и "список записей"! Т.е. List
> Record-ов!

Интересно, как это ты TList с рекордами одним движением сможешь положить на лист Excel ? В случае с вариантным массивом - ясно. А TList-то как ? (Это к вопросу VLAD-MAL   (17.05.04 17:56) [18] )


 
Fredericco ©   (2004-05-17 20:51) [24]

2 Anatoly Podgoretsky ©   (17.05.04 17:06) [11]
Однако да.
for i:=5 to High(Ar)-1 do
Ar[i]:=Ar[i+1];
SetLength(Ar,High(Ar));


 
evvcom ©   (2004-05-17 23:57) [25]


> VLAD-MAL   (17.05.04 17:14) [13]
> Ну, дык - сначала ж Move... От "хвоста" к "дырке"

Это адресовано мне? Тогда проследите цепочку [9, 10, 12], она не такая уж и длинная.


 
Курдль ©   (2004-05-18 10:26) [26]


> Интересно, как это ты TList с рекордами одним движением
> сможешь положить на лист Excel ? В случае с вариантным массивом
> - ясно. А TList-то как ? (Это к вопросу VLAD-MAL   (17.05.04
> 17:56) [18] )

Ок! :) Приведенная вами функция (положить в регион Ёкселя вариантный массив) - хороший пример как раз моего уточнения из [17]: Разве что получить (передать) длинные данные из какой-нить затченной под динамический массив внешней функции. (Я о ней не знал). А еще примеры пользы от динамического массива?


 
Vlad ©   (2004-05-18 10:52) [27]


> Курдль ©   (18.05.04 10:26) [26]


> А еще примеры пользы от динамического массива?

Временное хранение набора данных произвольной длины (длина заранее неизвестна) - стандартный вариант. Чем такой пример не устраивает ?


 
panov ©   (2004-05-18 10:57) [28]

Еще пример:

У меня динамически создается массив. Удалять записи в нем мне не нужно. Но нужно ыбстро обрабатывать массив и удалять(очищать).
ПРи использовании TList удалять элементы придется прямым циклом - вот и небольшой тормоз, критичный для моей задачи.


 
TUser ©   (2004-05-18 11:07) [29]


> А еще примеры пользы от динамического массива?

Вот мне надо сделать расчет по данным, которые берутся из описания белковой структуры. Размер структуры заранее не известен. След., все массивы - динамические. А количество исходной информации почти никогда не бывает известно.


 
Курдль ©   (2004-05-18 11:12) [30]


> Временное хранение набора данных произвольной длины (длина
> заранее неизвестна) - стандартный вариант. Чем такой пример
> не устраивает ?

Абсолютно не устраивает! Вот как раз классическое применение списка записей! У меня не было случая, чтобы НД содержал одинаковые типы данных, а работать с Вариант это "небезопасный код".


> ПРи использовании TList удалять элементы придется прямым
> циклом - вот и небольшой тормоз, критичный для моей задачи.

При использовании TObjectList достаточно сделать Free и все само собой очистится.


> Вот мне надо сделать расчет по данным, которые берутся из
> описания белковой структуры.

Слово "структуры" не я сказал, а Вы! :)


 
Vlad ©   (2004-05-18 11:21) [31]


> Курдль ©   (18.05.04 11:12) [30]
> Абсолютно не устраивает! Вот как раз классическое применение
> списка записей! У меня не было случая, чтобы НД содержал
> одинаковые типы данных, а работать с Вариант это "небезопасный
> код".

TMyRec = record
 ....
 ....
var
Arr1: array of TMyRec;

И чем это хуже TList ?
Кстати, если ты не в курсе, TList сам использует ^array of pointer


 
panov ©   (2004-05-18 11:24) [32]

>Курдль ©   (18.05.04 11:12) [30]

При использовании TObjectList достаточно сделать Free и все само собой очистится.

TObjectList работает с объектами типа TObject, но никак не с объектами типа record.


 
Курдль ©   (2004-05-18 11:25) [33]


> var
> Arr1: array of TMyRec;
>
> И чем это хуже TList ?

Ну хотя бы тем, что не имеет сортировки.
Я в курсе, что список - это и есть динамический массив указателей :)


 
Vlad ©   (2004-05-18 11:36) [34]


> Курдль ©   (18.05.04 11:25) [33]

А мне например сортировка почти никогда не требуется.
И я пользуюсь массивом, а не TList. И где я неправ ?
Или ты считаешь, что в этом случае TList все равно удобнее ?


 
Курдль ©   (2004-05-18 11:45) [35]


> Или ты считаешь, что в этом случае TList все равно удобнее
> ?

Если не трудно, приведи для примера самый короткий код создания, заполнения и освобождения массива записей для хранения НД.


 
Romkin ©   (2004-05-18 12:14) [36]

Ну и о чем вы спорите? Есть такое понятие, как абстрактный тип данных. И массив, и список здесь - это один тип, множество. И хороший программист не будет тупо совать что-то одно везде, а постарается выбрать реализацию своего типа наиболее оптимально.
И говорить о том, что что-то всегда лучше другого - благоглупость. Это почти то же самое, что говорить, что quicksort использовать всегда лучше, чем сортировку пузырьком... Или TList - всегда лучше, чем массив.


 
Vlad ©   (2004-05-18 12:38) [37]


> Romkin ©   (18.05.04 12:14) [36]

Я вобще-то в конечном счете именно это и хотел сказать, что в каждом случае нужно смотреть, что тебе выгоднее.
Но ув. товарищ Курдль имеет свое мнение, как в базах например всегда и везде агитирует использовать Cached Updates, так и тут склоняет народ к использованию TList


 
Курдль ©   (2004-05-18 15:20) [38]

Это я спецом на ложный след навожу, шоб конкурентов на рынке поубавить!

А все-таки, кроме шуток, я всерьез задумался об этих динамических массивах, тока экспериментировать лень. Если мне кто-нить даст ответ на [35], то я с удовольствием проанализирую.


 
Erik ©   (2004-05-18 17:14) [39]

Курдль
Заполнить масив, что ли? Или в чем удобство масивов? Ну могу сказать, что кода меньше писать надо, если ненадо удалять элементы. Я изучил исходники TList он реализован весльма оптимально. Но для масива удобнее написать к какому полю record обращатся, без преведения типов.
Myrec = record
FieldA: Integer;
FieldB: Word;
FieldC: TDataTime;
FieldG: TColor;
end;
MyArr: Array of Myrec;
...
MyArr[0].FieldG := clRed; //вот для этого и используются масивы


 
Alek_1   (2004-05-18 21:35) [40]

Незнаю кто для чего использует масивы, но я их использую в том случае если мне неизвестно заранее его размер.

Формат моего масива описан вот тута:
http://delphimaster.net/view/1-1084893344/

В нем записывается информация о пользователе и так как я незнаю сколько у меня их будет (может 10, может 200 а может 2000 млм вообще никого) то я рещил использовать динамический масив,, для того чтобы не проколоться и для тиого чтобы не переборщить :).



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

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

Наверх




Память: 0.57 MB
Время: 0.063 c
14-1084515269
Rule
2004-05-14 10:14
2004.05.30
Направте на правильный путь решения проблеммы..


14-1084149909
Думкин
2004-05-10 04:45
2004.05.30
С днем рождения! 10 мая


6-1081330444
pohil
2004-04-07 13:34
2004.05.30
Чат на Indy


7-1082731841
Andrew999
2004-04-23 18:50
2004.05.30
Как узнать сколько времени включен компьютер


14-1084214136
PaRL
2004-05-10 22:35
2004.05.30
Самообразование