![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Форумчане есть классы с их реализацией, появилась проблема не могу реализовать правильно добавление в список. вот код.
Код:
function TRam.AddSegment (const Segment: TSegment; Index: integer): integer;
var
i,j,tmp: integer; // переменные локальные
begin
FCount:=GetCount+1; // увеличение счётчика
if High(FRam) <= FCount+1 then setlength (FRam,FCount)
else setlength(FRam,length(FRam) *2); // проверка возможности расширение массива в 2 раза
for i:= 0 to FCount do
if FRam[i].GetNum <> Segment.GetNum then Exit// проверка возможности добавления, если элемент существует выходим из процедуры
for i:=0 to GetCount do
begin
j:=i;
tmp:=FRam[i];
while (Index > 0) and (Index < GetCount) do begin// поиск места вставки
for j:=0 downto Index do // внутренний цикл
begin
FRam[j+1]:=FRam[j];
FRam[Index]:=Segment;
Result:=Index;
Exit;
end;
Result:=-1;
end;Ошибки в методе добавления: - индексация в дин. массивах начинается с 0, что надо учитывать в циклах - проверка необходимости расширения массива сделана неправильно (кстати, проверка именно НЕОБХОДИМОСТИ, а не ВОЗМОЖНОСТИ!) - проверка существования элемента реализована неправильно (по заданию уникальность номеров сегментов не требуется) - поиск места вставки и сдвиг элементов с помощью ВЛОЖЕННЫХ циклов реализованы неправильно - это должны быть ДВА ОТДЕЛЬНЫХ цикла. Спасибо. |