Вниз
Скачать: CL | DM;

удаление элемента динамического массива   Найти похожие ветки 

← →
Ландграф Павел ©   (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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.021 c
3-1087717059
тот же
2004-06-20 11:37
2004.08.08
FastReport


14-1090563729
VMcL
2004-07-23 10:22
2004.08.08
Круглые "даты"


3-1089631143
HMT
2004-07-12 15:19
2004.08.08
Возможно глупый вопрос, как сохранить данные из blob-поля в...


1-1090397987
Igor_thief
2004-07-21 12:19
2004.08.08
Как получить высоту выпавшего PopupMenu?


1-1090455329
R
2004-07-22 04:15
2004.08.08
FileExists




   Наверх