![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как мне посмотреть исходники процедуры SetLength [D6, Win2k]
Андрусь © (2002-08-22 13:59:00)Привет всем!Такой вот вопрос.Как мне посмотреть исходники процедуры SetLength(прикалываться не надо - подводишь курсор,кликаешь мышкой).Хотябы шапку - типы входных параметров. Зараннее всем большое спасибо.
Alx2 (2002-08-23 10:39:00) [1]>Поиск д. идти по двум коорд.
Тогда сортируй по двум координатам сразу.
Игорь Шевченко (2002-08-23 09:46:00) [2]Пример двоичного поиска есть в
Program Files\Borland\Delphi\Source\Vcl\Classes.pas
TStringList.Find
Андрусь (2002-08-22 20:48:00) [3]Как организовать бинарный поиск,простите великодушно не въехал.
Андрусь (2002-08-22 18:51:00) [4]Тут у меня прикол то вообще. Плёнка плоская,координата х,у. Поиск д. идти по двум коорд.
Игорь Шевченко (2002-08-22 18:22:00) [5]По тому, по чему будешь чаще всего искать, очевидно. Если ищещь по координате Left, к примеру, то по ней.
Но при удалении список не надо отсортировывать, надо при добавлении. Можно и линейный поиск использовать...
Андрусь (2002-08-22 18:17:00) [6]Т.е. перед каждым удалением сортировать список,но по чём?
Игорь Шевченко (2002-08-22 17:55:00) [7]binary search - стандартный алгоритм поиска в ОТСОРТИРОВАННОМ списке. Достаточно быстрый.
Андрусь (2002-08-22 17:51:00) [8]>Игорь Шевченко © (22.08.02 17:32)
>SearchItemIndex лучше организовать с использованием двоичного поиска.
Извините,чего то не до конца въехал,что вы имели в виду.
Игорь Шевченко (2002-08-22 17:32:00) [9]Андрусь © (22.08.02 17:27)
procedure List.DeleteRGrain (ALeft, ARight : Integer);
var
ItemToDelete : PRGrain;
ItemToDeleteIndex : Integer;
begin
ItemToDeleteIndex := SearchItemIndex(Left, Right);
ItemToDelete := Items[ItemToDeleteIndex];
Delete(ItemToDeleteIndex);
Dispose (ItemToDelete);
end;
SearchItemIndex лучше организовать с использованием двоичного поиска
Андрусь (2002-08-22 17:27:00) [10]>Игорь Шевченко © (22.08.02 16:29)
А вот что делать с удалением. Допустим хочу удалить элемент,где Let,Right определены. Как это сделать. Сканируем сесь List,находим удовлетворяющих запросу,делаем Delete.Что происходит с участками памяти,на которые указывал указатель.Они получаюся неосвобождёнными.Эт нехорощо.Как удалить где все элементы удалены - опять полное сканирование?
Ученик (2002-08-22 16:47:00) [11]>Alx2 © (22.08.02 16:41)
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030015372&n=0
Alx2 (2002-08-22 16:41:00) [12]>Ученик © (22.08.02 16:34)
Получается D6 only? :)
Ученик (2002-08-22 16:34:00) [13]>Alx2 © (22.08.02 16:28)
В вопросе есть версия D6 :-)
Игорь Шевченко (2002-08-22 16:29:00) [14]Андрусь © (22.08.02 16:11)
Пишешь правильно.
Я так полагаю, что фрагментация памяти здесь окажет не слишком сильное влияние. Со списком работать в данном случае может быть проще, а это значит, что можно сосредоточиться на решении основной задачи.
В Минск рад бы (уж очень город нравится!), но повода нету...
Alx2 (2002-08-22 16:28:00) [15]>Ученик © (22.08.02 15:15)
Только вот в хелпе написали:
The actual format of the runtime type information is internal to the compiler and may change between releases.
Андрусь (2002-08-22 16:11:00) [16]>PVOzerski © (22.08.02 15:46)
К этому выводу я уже приходил. Но всё же хотелось бы без GetMem...
>Игорь Шевченко © (22.08.02 15:35)
Идея интерестная,но как приспособить под это списки. Исходная задача: нужно смоделировать некоторый процесс в тонкой плёнке. Есть динамические массивы с элементами типа Record, описывающими различные участки и состояния плёнки.Я хочу написать процедуру удаления элемента,общую для всех динамических массивов. TList удобен тем что там уже всё реализовано.
type
PRGrain = ^RGrain;
RGrain = Record
Left :integer;
Top :integer;
Height:integer;
Width :integer;
Phase :TPhase;
End;
Затем использовать:
Procedure Add_Element(ALeft,ATop,AHeight,AWidth :integer;
Phase :TPhase);
var p:PRGrain;
Begin
New(p);
p^.Left:=ALeft;
.............
Lisr.Add(p);
End;
Я правильно пишу? Только вот напрягает один момент:в случае масива память будет выделена одним куском,а тут разбросана. Число элементов м.б.довольно велико,следовательно доступ,обращение - в общем скорость работы с таким массивом понизится.
P.S. В Минск не собираетесь - буду очень рад с умным человеком пообщаться.
Alx2 (2002-08-22 16:10:00) [17]>Ученик © (22.08.02 15:15)
Класс!
PVOzerski (2002-08-22 15:46:00) [18]Я бы игрался только через ReallocMem и Move. И никаких "динамических массивов" с SetLength! Можно, конечно, сделать оболочку-процедуру. Вот как это может выглядеть.
type
MyType=integer; //например
tArray=array[0..0]of MyType; //можно и с другим нач. индексом
pArray=^tArray;
var
MyArray:pArray;
i:longint;
begin
//создаём массив из 1000 элементов
GetMem(MyArray,1000*sizeof(MyType));
//заполняем
for i:=0 to 1000-1 do
MyArray[i]:=i;
//удаляем сотый элемент через "сдвиг"
move(MyArray[100],MyArray[99],sizeof(MyType)*((1000-1)-100));
//уменьшаем длину массива
ReallocMem(MyArray,999*sizeof(MyType));
end.
За правильность расчёта длины смещаемого блока не ручаюсь: нет времени долго думать. Но идея, надеюсь, понятна. PS: ни SetLength, ни Length при таком подходе неприменимы. PPS: Этот подход допускает использование открытых массивов, но только с использованием функции Slice.
Игорь Шевченко (2002-08-22 15:35:00) [19]Андрусь © (22.08.02 15:21)
Это исходный текст - то, что ты просил.
А кстати зачем удалять произвольный элемент из динамического массива ? Не проще ли список использовать ?
Андрусь (2002-08-22 15:21:00) [20]>Игорь Шевченко © (22.08.02 15:16)
Большое спасибо,но я не шарю в asmе :}.