Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.029 c
14-1090457972
Soft
2004-07-22 04:59
2004.08.08
Netscape7(mozilla) или программирование хаком...


14-1090306595
zuk
2004-07-20 10:56
2004.08.08
Горячие клавиши в винде.


3-1089392505
Piero
2004-07-09 21:01
2004.08.08
параметр процедуры - таблица


8-1085322269
Sanek_metaller
2004-05-23 18:24
2004.08.08
Как загрузить SWF из DLL?


3-1089617066
Prohodil Mimo
2004-07-12 11:24
2004.08.08
При загрузке системы почему-то стал отключаться сервер ИБ.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский