![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
удаление элемента динамического массива [D7, WinXP]
Ландграф Павел © (2004-07-25 22:39:00)Делаю так:
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;
Может кто писал процедуру удаление элемента динамического массива, подскажите...
Anatoly Podgoretsky (2004-07-26 13:13:00) [1]Ландграф Павел © (26.07.04 12:18) [7]
Проверка лишней не бывает, как известно не заряженое ружье стреляет в последнем акте. Других ошибок пока не вижу.
Ландграф Павел (2004-07-26 12:18:00) [2]Магнитон Борыч> на паскале да, но с динамикой быстрее...
Serge_>не то...
wnew>пасиб! вот в этом string и была ошибка, остальное все правельно=)
Германн>это ты не прав! Last-это предпоследний элемент! а setLength(buffer,Last); делает его последним!!! ты наверное high() с Length() перепутал...
Anatoly Podgoretsky>ну во-первых в МОЕЙ программе index никогда не будет больше last, поэтому эта проверка лишняя...=) Про утечку ты прав, но она только у string`а, у shortstring токого нету...
Anatoly Podgoretsky (2004-07-26 08:57:00) [3]wnew © (26.07.04 01:34) [3]
Нет не работоспособна, по крайней мере две ошибки, обе серьезные
1. Index может быть больше чем Last, а проверки нет
2. После перемещения элементов происходит утечка памяти, значение name не освобождается.
Германн © (26.07.04 03:36) [5]
Здесь нет никакой ошибки, если предположить, что у него действительно динамический массив, а возможно это не так, то произойдет усечение массива на один элемент.
Германн (2004-07-26 03:36:00) [4]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 - сможет установить инуюдлину?
Fay (2004-07-26 02:45:00) [5]TBuffer включающий string смотрится крайне подозрительно.
Ваще.
wnew (2004-07-26 01:34:00) [6]Твоя процедура вполне работоспособна, а ошибка возникает очевидно из-за того, что name у тебя имеет тип AnsiString, т.е. переменной длинны. Измени тип на ShortString или просто - name: string[30], не может же имя быть очень длинным. И должно всё стать на свои места. А процедура Move вроде бы работает очень быстро, по крайней мере быстрей, чем банальное копирование ячеек влево в цикле.
Serge_ (2004-07-25 23:49:00) [7]type pBuffer=^TBuffer;
и
TList...
Магнитон Борыч (2004-07-25 23:04:00) [8]Так не удалить, по-моему..
Лучше сделать связный список.