Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив 
:(
    Опции темы
Vinnety
Дата 13.6.2003, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



Умельцы!!! Объясните что такое динамический массив и как с ним работать (например, записать данные - скажем packed record) . Заранее благодарен ! biggrin.gif
PM MAIL   Вверх
altarasjuk
Дата 13.6.2003, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Динамический массив- это массив с переменной длинной. Его лучше по возможности не использовать, но если надо то вот:

Код

TRec = Record
 f1: String;
 f2: Integer;
 f3: Int64;
end;

var
 arr: array of Trec;


для изменения длинны массива:
SetLength(arr, size);

и соответственно:
Код

var
 rec: TRec;
begin
 SetLength(arr, 10); // = arr: array[0..9] of TRec;
 arr[10] = ... // Вызовет access voilation т.к. arr[10] не существует.

 rec.f1:= 'asdasdad';//
 rec.f2:= 10;             // Присваивание эл-ту arr[2] значения rec;
 rec.f3:= 1555646;  //
 arr[2]:= rec;          //
end;


Вот по такому принципу работается с дин. массивами.
Но помни, если обратишься к не существующему эл-ту, то получишь access voilation! Самые популярные грабли smile.gif


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



>Его лучше по возможности не использовать

А почему?
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



dm9, по тому, что
Цитата
если обратишься к не существующему эл-ту, то получишь access voilation! Самые популярные грабли
И это в действительности так и есть(эту ошибку очень сложно отловить). Я всё же думаю, что лучше использовать листы (TListб TinterfaceList, TClassList), но его опять же надо использовать умо, а не так как некоторые.
Многие пишут так:
TList.Add(Pointer(10))

А правильно было бы так:
TInteger = class
Value: Integer;
end;

TInteger.Value:= 10;
TList.Add(TInteger);

Конструкторы как бы подразумиваются...


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



>если обратишься к не существующему эл-ту, то получишь access voilation!

Ясно. Просто нужна аккуратность. Но, в общем-то, как и везде. У меня проблем с динамическими массивами не было, хотя использую их достаточно часто - очень уж удобно.
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



dm9, а чем не удобны листы? Да и из дин. массива не вырежешь эл № 5.


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Unregistered
Дата 19.6.2003, 15:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 altarasjuk:
вырежишь. только это будет долго и больно smile.gif
  Вверх
altarasjuk
Дата 19.6.2003, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Цитата
вырежишь. только это будет долго и больно 
нет не вырежешь: можно только создать 2 массив на основе первого, но только без эл-та № 5. Разве это можно назвать вырезанием, а скорость?


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
dm9
Дата 19.6.2003, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Согласен, но я использую динамические массивы, в основном, когда надо сделать какую-то двухмерную таблицу, из которой вырезать ничего не приходится.
PM MAIL ICQ   Вверх
altarasjuk
Дата 19.6.2003, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



dm9, я не противник массивов как таковых, просто моё мнение - если есть возможность их не использовать - то надо их не использовать.


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Shuricksoft
Дата 20.6.2003, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.3.2002
Где: Odessa, Ukraine

Репутация: нет
Всего: нет



Цитата
можно только создать 2 массив на основе первого

А можно первый подредактировать - тоже вырезать получится =)
PM MAIL ICQ   Вверх
altarasjuk
Дата 20.6.2003, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Цитата
А можно первый подредактировать - тоже вырезать получится =)
Ну это уже будет садизм


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
&-ray
Дата 20.6.2003, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

Репутация: нет
Всего: нет



Цитата
Ну это уже будет садизм


Не больший садизм, чем заново создавать новый массив.

Удаляем 5 элемент:

for x:=4 to length(my_array)-2 do my_array[x]:=my_array[x+1];
setlength(my_array,length(my_array)-1);

По-моему даже просто :-)




--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
altarasjuk
Дата 20.6.2003, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Ну это разве не садизм по сравнению с .Remove(id|element)? smile.gif


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Fantasist
Дата 20.6.2003, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Цитата
for x:=4 to length(my_array)-2 do my_array[x]:=my_array[x+1];
setlength(my_array,length(my_array)-1);


Еще проще:

Код

type

  IntArr=array of integer;

procedure ArrRemove(var a:IntArr; index:integer);
begin
 if (index<0) or (index>length(a)) then
     raise Exception.Create('Out of bound');
 Move(a[index+1],a[index],(length(a)-index-1)*sizeof(integer));
 SetLength(a,length(a)-1);
end;


И будет не извращенее чем .Remove(id|element). Только я тоже предпочитаю TList, ибо инкапсуляция.
Хотя надоедает писать все время TList.Create, Free. Преобразование типов тоже надоедает, поэтому я обычно пишу наследника от TList с перекрытым Items, который возвращает нужный тип. Но это тоже добивает.

Цитата
TInteger = class
Value: Integer;
end;

TInteger.Value:= 10;
TList.Add(TInteger);


Ну уж большего садизма я не видел. smile.gif Всегда писал list.Add(Pointer(int_Value)). Не подразумеваю, что моя программа будет работать на платформе, где размер указателя отличается от размера Integer.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.