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