Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.027 c
11-1062612623
Есть вопрос
2003-09-03 22:10
2004.04.18
ПрогрессБарEX


6-1077123088
diMAN
2004-02-18 19:51
2004.04.18
Обмен данными client - server


14-1080526193
Думкин
2004-03-29 06:09
2004.04.18
С днем рождения! 29 марта.


1-1080505135
Diver
2004-03-29 00:18
2004.04.18
ComboBox


3-1079606356
SnapIn
2004-03-18 13:39
2004.04.18
Как увидеть данные из .ORA




   Наверх