Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизУдаление элемента из динамического массива. Найти похожие ветки
← →
Gear (2005-06-06 14:40) [0]Здравствуйте!
Есть в сети функции удаления элементов из динамического массива:
procedure delElem( var A:TRectArray; Index:integer );
var Last : integer;
begin
Last:= high( A );
if Index < Last then move( A[Index+1], A[ Index ],
(Last-Index) * sizeof( A[Index] ) );
setLength( A, Last );
end;
Так вот что делать если динамический массив это:
TCallList = record
CallID: string;
ani: string;
end;
...
CallList: array of TCallList;
В данном случае sizeof( A[Index] ) ) - разные величины для каждого элемента. Как выкрутится красиво?
← →
Digitman © (2005-06-06 14:41) [1]
> sizeof(A[Index]))
ой врешь !
← →
Alexander Panov © (2005-06-06 14:45) [2]Не надо извращаться.
Воспользуйся стандартным способом.procedure delElem( var A:TRectArray; Index:integer );
var
Last: Integer;
i: Integer;
begin
Last := High(A);
if Index < Last then
begin
for i := Index to Last-1 A[Index] := A[Index+1];
end;
SetLength( A, Last );
end;
← →
Erik1 © (2005-06-06 14:49) [3]Если хочеш использовать Move, то запись TCallList должна состоять из простых типов. Вместо String используй ShortString.
← →
Суслик © (2005-06-06 14:50) [4]можно использоваться move, но запись должна состоять из простых типов, иначе нужно пользоваться фукнцией finilize.
← →
REA (2005-06-06 16:50) [5]Не надо извращаться, используй два TStringList. Или класс который будет синхронно с ними работать.
← →
VladimirB © (2005-06-06 16:54) [6]В данном случае sizeof( A[Index] ) ) - разные величины для каждого элемента.
С чевойто они разные?
4+4 = 8 байт.
String это ведь указатель и его размер не зависит от длины строки, так что все ОК в delElem.
← →
Chlavik © (2005-06-06 18:23) [7]Может тут проще заюзать связанный список ??
type
PElement = ^TElement;
TElement =record
Data:Pointer;
before:PElement;
end;
Для того что бы удалить что то надо просто осводить память елеменат ( то что хранится в Дата) и указать и сявзать через Before c предидущим
← →
Sapersky (2005-06-06 18:27) [8]String это ведь указатель... так что все ОК в delElem
Память, на которую он указывает, не освободится (дельфийский менеджер памяти не настолько умный чтобы учитывать затирающие указатель мувы). Нужно предварительно сделать Finalize для удаляемого элемента - Finalize(A[Index]).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.064 c