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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
2-1153989790
Ironman83
2006-07-27 12:43
2006.08.20
Запись сетевого имени файла


2-1153393351
Mintos
2006-07-20 15:02
2006.08.20
Перевод фамилий


2-1154538692
Tivaya
2006-08-02 21:11
2006.08.20
Поток в потоке


5-1137932033
hawkins
2006-01-22 15:13
2006.08.20
ZipTV триальная версия


15-1153971454
Nic
2006-07-27 07:37
2006.08.20
Вопросик по php