Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Внизудаление элемента динамического массива Найти похожие ветки
← →
Ландграф Павел © (2004-07-25 22:39) [0]Делаю так:
type TBuffer=record
pos : TPoint;
RectOffset: TPoint;
h : word;
name : String;
end;
procedure delElem(Index:integer );
var Last : integer;
begin
Last:= high(buffer);
if Index < Last then move(buffer[Index+1],buffer[Index],(Last-Index)*sizeof(buffer[Index]));
setLength(buffer,Last);//Сдеся глючит, неправельно устанавливает длину
end;
Может кто писал процедуру удаление элемента динамического массива, подскажите...
← →
Магнитон Борыч (2004-07-25 23:04) [1]Так не удалить, по-моему..
Лучше сделать связный список.
← →
Serge_ (2004-07-25 23:49) [2]type pBuffer=^TBuffer;
и
TList...
← →
wnew © (2004-07-26 01:34) [3]Твоя процедура вполне работоспособна, а ошибка возникает очевидно из-за того, что name у тебя имеет тип AnsiString, т.е. переменной длинны. Измени тип на ShortString или просто - name: string[30], не может же имя быть очень длинным. И должно всё стать на свои места. А процедура Move вроде бы работает очень быстро, по крайней мере быстрей, чем банальное копирование ячеек влево в цикле.
← →
Fay © (2004-07-26 02:45) [4]TBuffer включающий string смотрится крайне подозрительно.
Ваще.
← →
Германн © (2004-07-26 03:36) [5]2 Ландграф Павел © (25.07.04 22:39)
Вообще учти замечания про AnsiString и про string. Ну это во-первых.
Во-вторых. Ну а что ты хочешь при таком коде:
begin
Last:= high(buffer);
if Index < Last then move(buffer[Index+1],buffer[Index],(Last-Index)*sizeof(buffer[Index]));
setLength(buffer,Last);//Сдеся глючит, неправельно устанавливает длину
end
Last - высчитывается только однажды при входе в процедуру. Так и с какого, SetLength - сможет установить иную длину?
← →
Anatoly Podgoretsky © (2004-07-26 08:57) [6]wnew © (26.07.04 01:34) [3]
Нет не работоспособна, по крайней мере две ошибки, обе серьезные
1. Index может быть больше чем Last, а проверки нет
2. После перемещения элементов происходит утечка памяти, значение name не освобождается.
Германн © (26.07.04 03:36) [5]
Здесь нет никакой ошибки, если предположить, что у него действительно динамический массив, а возможно это не так, то произойдет усечение массива на один элемент.
← →
Ландграф Павел © (2004-07-26 12:18) [7]Магнитон Борыч> на паскале да, но с динамикой быстрее...
Serge_>не то...
wnew>пасиб! вот в этом string и была ошибка, остальное все правельно=)
Германн>это ты не прав! Last-это предпоследний элемент! а setLength(buffer,Last); делает его последним!!! ты наверное high() с Length() перепутал...
Anatoly Podgoretsky>ну во-первых в МОЕЙ программе index никогда не будет больше last, поэтому эта проверка лишняя...=) Про утечку ты прав, но она только у string`а, у shortstring токого нету...
← →
Anatoly Podgoretsky © (2004-07-26 13:13) [8]Ландграф Павел © (26.07.04 12:18) [7]
Проверка лишней не бывает, как известно не заряженое ружье стреляет в последнем акте. Других ошибок пока не вижу.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.032 c