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

Вниз

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

 
Knight ©   (2004-03-24 21:48) [0]

... сказал я, задвинув забрало, в ожидании града камней... [)

Есть ли функции, для удаления произвольного элемента из динамического массива?


 
Fredericco ©   (2004-03-24 22:03) [1]

Рискну.
ИМХО - нет.

ЗЫ. Интересно, а если так сделать Dispose(@MyArr[i]), чего получится?..


 
Knight ©   (2004-03-24 22:05) [2]

На сколько помню... Dispose - это для всего массива...


 
TButton ©   (2004-03-24 22:06) [3]

>ЗЫ. Интересно, а если так сделать Dispose(@MyArr[i]), чего получится?..
обращение к MyArr[i] вызовет AV?


 
Knight ©   (2004-03-24 22:16) [4]

... от удивления поднял забрало...

Неужели и правда нет? А я думал, раз Length() берёт длину, то почему бы не быть какой-то procedure Delete(DinArr,Index,Count) удаляющей из динамического массива произвольное количество элементов с указанной позиции, ведь, как я понимаю, массив состоит из элементов одного типа, под которые выделены равные блоки памяти... т.е. если в массиве есть объекты, то высвобождаем их, затем вызываем процедуру и она сдвигает массив в нужном месте.


 
TButton ©   (2004-03-24 22:22) [5]

эээ.... а зачем задавался вопрос???


 
Anatoly Podgoretsky ©   (2004-03-24 22:32) [6]

Ответ, нет, если не считать удаления конца.


 
Knight ©   (2004-03-24 22:50) [7]


> [6] Anatoly Podgoretsky ©   (24.03.04 22:32)

А в чём сложность?


 
Nous Mellon ©   (2004-03-24 22:52) [8]

Думается, что сложность в том чтобы правильно определить размер элемента(он может быть разным в зависимости от Типа данных?) а потом еще и правильно сдвинуть остальные. Но это так мысли вслух :)


 
Knight ©   (2004-03-24 22:52) [9]

А нельзя как-то это использовать?

procedure TStringList.Delete(Index: Integer);
begin
 if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
 Changing;
 Finalize(FList^[Index]);
 Dec(FCount);
 if Index < FCount then
   System.Move(FList^[Index + 1], FList^[Index],
     (FCount - Index) * SizeOf(TStringItem));
 Changed;
end;


 
TButton ©   (2004-03-24 22:53) [10]

надо использовать не массивы а связаные списки (так?), там с удалением нет проблем.


 
TButton ©   (2004-03-24 22:54) [11]

а вообще - функция есть. я в свое время писал такую. могу найти... если надо... но помоему такие все писали...


 
Knight ©   (2004-03-24 22:59) [12]


> [10] TButton ©   (24.03.04 22:53)
> надо использовать не массивы а связаные списки (так?), там
> с удалением нет проблем.

Можно конечно, делал когда-то в BP7.0...


> ] TButton ©   (24.03.04 22:54)
> а вообще - функция есть. я в свое время писал такую. могу
> найти... если надо... но помоему такие все писали...

Вот и я о том же, а почему её среди стандартных нет?


 
panov ©   (2004-03-24 23:00) [13]

Даже если данные имеют одинаковую длину(например, Integer), то не факт, что в любой версии Windows выравнивание элементов в памяти будет одинаковым.
А значит, универсальную фуекцию надо писать самому.


 
Anatoly Podgoretsky ©   (2004-03-24 23:18) [14]

Knight ©   (24.03.04 22:50) [7]
Слодностей нет, но и функци нет. Вопрос то был не про ток, как сделать, а если ли функция.


 
TButton ©   (2004-03-24 23:26) [15]

а вот не всякому массиву одна и та же функция подойдет. хотя почему, подойдет если будет руками пертаскивать элемент за элементом... и опять же... одно дело массив integer"ов и совсем другое - массив объектов. первый хранит интеджеры, а второй - указатели (так?). во втором случае еще и объекты чистить надо, вобщем проще самому написать удалялку.


 
Knight ©   (2004-03-25 00:07) [16]

Нет так нет... Подумаю, может на списки переделаю. Всем спасибо.


 
Alex Konshin ©   (2004-03-25 02:36) [17]

Ну можешь еще посмотреть мои динамические массивы. Там удаление есть.
А у тебя динамические массивы чего?


 
Думкин ©   (2004-03-25 06:11) [18]

Про такое у Бакнелла хорошо прописано.


 
MBo ©   (2004-03-25 06:23) [19]

Удаление 9-го элемента
Move(DynArr[10],DynArr[9],SizeOfArrayElement*(Length(DynArr)-10));
при необходимости
SetLength(DynArr,Length(DynArr)-1);


 
Alex Konshin ©   (2004-03-25 07:32) [20]

MBo ©   (25.03.04 06:23) [19]
Это нельзя оставить без комментария.
В общем случае это некорректно, так как в случае массива записей, в которой есть поля String, Variant и т.п. эти поля не будут финализироваться (например, не будут уменьшаться счетчики ссылок).


 
MBo ©   (2004-03-25 07:54) [21]

>Alex Konshin ©   (25.03.04 07:32) [20]
Безусловно. Однако автор ни разу не сказал, какого типа элементы.


 
Verg ©   (2004-03-25 08:38) [22]

Чем-то это мне напоминает вопрос - "Как удалить бит из байта?".....


 
Паниковский   (2004-03-25 08:51) [23]

Knight
сам напиши так быстрее чем искать фигнистику всякую


 
Knight ©   (2004-03-29 21:12) [24]


> Alex Konshin ©   (25.03.04 02:36) [17]
> Ну можешь еще посмотреть мои динамические массивы. Там удаление
> есть.
> А у тебя динамические массивы чего?


Record в который входят String, Integer, TBitmap.


> Паниковский   (25.03.04 08:51) [23]
> Knight
> сам напиши так быстрее чем искать фигнистику всякую


В общем уже сделал.



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

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

Наверх




Память: 0.52 MB
Время: 0.058 c
1-1080434014
Dimedroll
2004-03-28 04:33
2004.04.18
-= Можно ли все Error ловить своей проги посредством WinAPI =-


1-1080742977
ПрогерШ
2004-03-31 18:22
2004.04.18
символ при вводе пароля


14-1080241821
Мазут Береговой
2004-03-25 22:10
2004.04.18
Вопрос к Киевлянам.


3-1079683716
unicode
2004-03-19 11:08
2004.04.18
Ibase и SQL server


4-1076877060
Axon
2004-02-15 23:31
2004.04.18
!!! OpenProceess !!!