Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.04 c
2-1154521483
Id
2006-08-02 16:24
2006.08.20
Функции в Delphi


15-1153478322
Jeer
2006-07-21 14:38
2006.08.20
Программазм или "одиночка vs конвейр"


6-1144164046
WebSqlNeederr
2006-04-04 19:20
2006.08.20
Как отловить, что часть документа загружена?


1-1152018812
salexn
2006-07-04 17:13
2006.08.20
Рекурсивные процедуры


2-1154180150
cando
2006-07-29 17:35
2006.08.20
Использование FindFirstChangeNotification





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский