Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизДинамический масив Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.04 c