Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

удаление элемента динамического массива [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]

Так не удалить, по-моему..
Лучше сделать связный список.


Наверх

Титульная страница Поиск, карта сайта Написать письмо