Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Внизпро динамические массивы Найти похожие ветки
← →
Ezorcist (2006-07-28 17:08) [0]как удалить элемент из динамического массива? Что бы все впередистоящие "сдвинулись, закрыв дыру" :)))
← →
Мефисто (2006-07-28 17:12) [1]Move() + F1 Там есть маленький пример.
← →
Jeer © (2006-07-28 17:26) [2]Ezorcist (28.07.06 17:08)
> Что бы все впередистоящие "сдвинулись
Плохая мысль.
Изучать структуры данных, "безболезненно" позволяющие такие операции.
Linked List - связанный список.
← →
Мефисто (2006-07-28 17:35) [3]var
I: Integer;
A: array of integer;
begin
SetLength(A, 10);
for I := Low(A) to High(A) do
A[I] := Random(50);
MoveMemory(@A[4], @A[5], SizeOf(Integer) * 5);
SetLength(A, 9);
end;
Из массива удаляется 5-й элемент с индексом 4.
А на его место смещаем оставшийся хвост массива из пяти элементов.
И обрезаем длину массива.
← →
Ezocist (2006-07-28 18:31) [4]2 Мефисто
для I-того элемена будет выглядеть как?
MoveMemory(@A[I-1], @A[I], SizeOf(Integer) * I); &
← →
Мефисто (2006-07-28 19:12) [5]
> Ezocist (28.07.06 18:31) [4]
Это я для примера грубо написал. Жестко прописаны циферки (т.к. в уме уже все подсчитанно).
Сначала обясни какие ты элементы хочешь удалять?
Через MoveMemory можно удалить либо один элемент массива, или блок (несколько подряд идущих элементов массива).
Т.е. получается:
индекс элемента: 0, 1, 2, 3
значение элемента: 9, 8, 6, 7
удаляем 8:
MoveMemory(@A[1], @A[2], SizeOf(Integer) * 2 {сколько элеметво осталось в хвосте})
удаляем блок 8, 6:
MoveMemory(@A[1], @A[3], SizeOf(Integer) * 1 {сколько элеметво осталось в хвосте})
Смассивом надо еще будет потрудится т.к. необходимо делать проверки что значания входят в нужный диапазон (индексы элементов). К примеру: в MoveMemory второй параметр этой процедуры. Данный индекс массива должен быть больше индекса массива переданного в первый параметр процедуры и т.д.
Более удобный метод динамического управления списком: Jeer © (28.07.06 17:26) [2]
← →
Ezocist (2006-07-28 21:23) [6]2 Мефисто
Спасибо! Только что такое Linked List?
Сейчас нашел просто TList - весьма удобно и просто.
И по нему вопрос возник: если в TList все Item : Pointer. Как запихнуть в Item просто TMyClass?
← →
@!!ex © (2006-07-28 21:30) [7]хм... Если тебе имеет значение порядок элементов то тебе уже сказали.
Если порядок значения не имеет, то есть быстрый способ. Я им всегда пользуюсь.
← →
palva © (2006-07-28 21:31) [8]Преобразовать объект в Pointer и сохранить в TList. Но по хорошему от Tlist нужно наследовать свой объект, в котором переписать Add Delete Insert Clear и прочие функции (не помню так ли они называются) Эти функции будут вызывать конструкторы а также освобождать объект.
← →
@!!ex © (2006-07-28 21:32) [9]>>И по нему вопрос возник: если в TList все Item : Pointer. Как запихнуть в Item просто TMyClass?
Хм. В Item нельзя запихнуть TMyClass, зато можно запихнуть адрес памяти где находиться экземпляр TMyClass
← →
palva © (2006-07-28 21:54) [10]Такой пример
{$APPTYPE CONSOLE}
uses Classes;
var
lst: TList;
bits: TBits;
begin
lst := TList.Create;
bits := TBits.Create;
bits[4] := True;
lst.Add(Pointer(bits));
bits := TBits(lst[0]);
WriteLn(bits[4]); // True
TBits(lst[0]).Free;
lst.Free;
end.
Но корректнее, конечно, написать свой порожденный класс.
← →
Мефисто (2006-07-28 21:57) [11]
> palva © (28.07.06 21:31) [8]
От TList лучше вообще не наследоваться. А создать свой клас, заточенный под свои нужды. TList и так притормаживает из-за не однократных проверок на корректный диапазон индексов в работе своих методов.
> Ezocist (28.07.06 21:23) [6]
TList.Add(Pointer(1));
:= Integer(TList[Index]);
а в Jeer © (28.07.06 17:26) [2]
имелось ввиду: динамические связные списки. Погугли - и найдешь искомое. Так же про эти списки можно инфу найти во многих букварях по дельфи.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c