Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: 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 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
3-1089723069
STM
2004-07-13 16:51
2004.08.08
Pack dbf из Delphi


4-1088413866
Buster
2004-06-28 13:11
2004.08.08
Как определить время создания файла и директории?


14-1090304826
удивленный
2004-07-20 10:27
2004.08.08
Удивлен я вот чем


1-1090933083
KIR
2004-07-27 16:58
2004.08.08
Народ, как заптхивать/доставать картинки из dll


1-1090922523
ko
2004-07-27 14:02
2004.08.08
TfileListBox