Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
14-1084360870
bon
2004-05-12 15:21
2004.05.30
Как отменить все сообщения, посылаемые окну?


14-1084101378
lak
2004-05-09 15:16
2004.05.30
беда с кольцами


11-1074200421
Neep
2004-01-16 00:00
2004.05.30
Создание меню без MCK


14-1083286022
wyny
2004-04-30 04:47
2004.05.30
Windows XP или Windows 2000 Что лучше?


1-1084276915
alex4400
2004-05-11 16:01
2004.05.30
Звук определенной частоты и длительности





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский