|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
проблема с добавлением в список. Delphi7
Форумчане есть классы с их реализацией, появилась проблема не могу реализовать правильно добавление в список. вот код.
Код:
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, что надо учитывать в циклах - проверка необходимости расширения массива сделана неправильно (кстати, проверка именно НЕОБХОДИМОСТИ, а не ВОЗМОЖНОСТИ!) - проверка существования элемента реализована неправильно (по заданию уникальность номеров сегментов не требуется) - поиск места вставки и сдвиг элементов с помощью ВЛОЖЕННЫХ циклов реализованы неправильно - это должны быть ДВА ОТДЕЛЬНЫХ цикла. Спасибо. |
#2
|
|||
|
|||
Как-то так
Код:
function TRam.AddSegment (const Segment: TSegment; Index: integer): integer; var i,j,tmp: integer; // переменные локальные begin Result:=-1; // контроль параметров if Index >= FCount then Exit; if Index < 0 then Exit; // сначала проверка необходимости вставки // это на случай, если нужны уникальные номера // если не надо, то следующий цикл комментируем for i:= 0 to FCount-1 do begin if FRam[i].GetNum = Segment.GetNum then begin Result:=i; Exit; end; end; // теперь посмотрим, есть ли место в массиве FCount:=GetCount+1; // увеличение счётчика if High(FRam) >= FCount then begin //место есть, ничего делать не надо end else begin // надо увеличивать // расширение массива в 2 раза setlength(FRam,length(FRam) *2); end; // сдвигаем for i:= FCount downto (Index+1) do FRam[i] := FRam[i-1]; // записываем FRam[Index]:=Segment; //выдаём - куда записали Result:=Index; end; |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Deman1986 (07.10.2014)
|
#3
|
|||
|
|||
Спасибо большое. Еще один вопросик. У меня есть процедура загрузки из файла. Компилятор ругается на несовместимость типов. Как исправить незнаю.
Код:
procedure TRam.LoadFile (const FileName: string); var f: TextFile; s,st,st2,st3,name: string; i,cop,j,g: integer; Shelf: TSegment; Page: TPage; flag: Boolean; begin Clear; AssignFile(f,FileName); // открыли файл Reset(f); while not Eof(f) do // цикл сборки массива begin Readln(f,s); if s = ''then Continue; i:=AddSegment(StrToInt(s)); // вот тут ошибка. if i < 0 then Continue; Shelf:= FRam[i]; while not Eof(f) do begin name:=''; flag:=false; // переменная введена для разбиения строки на "Номер страницы" и "Состояние" st3:=''; cop:=0; Readln(f,s); if s =''then Break; for j:= 1 to Length(s) do begin st:= copy(s,j,1); // копируем по одному символу из строки для дальнейшей обработки if st <> '*' then name:=name + st else begin flag:=true; break; end; end; if flag = true then begin // flag = True- for g:= j+1 to Length(s) do begin st2:=copy(s,g,1); st3:=st3+st2; // собираем строку: состояние end; flag:=false end; cop:=strtoint(st3); // преобразуем тип Page:=TPage.Create(cop,true); // создали информационный объект Shelf.AddTPage(Page); // добавили его end; end; CloseFile(f); // закрыли файл end; Последний раз редактировалось Deman1986, 07.10.2014 в 19:55. |
#4
|
|||
|
|||
А поиск места вставки не нужен??
|
#5
|
||||
|
||||
Первый раз вижу такой стиль оформления кода - ступенькой.
А ошибка у вас возникает из за пропущенного параметра. Вот у вас описание как выглядит: Код:
AddSegment (const Segment: TSegment; Index: integer): integer; Код:
i:=AddSegment(StrToInt(s)); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Так учили в колледже ))).Вот я думаю как вставить недостающий параметр.
Последний раз редактировалось Deman1986, 08.10.2014 в 09:41. |
#7
|
||||
|
||||
Цитата:
Код:
... i:= AddSegment(Shelf, StrToInt(s)); ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
Вставляю, Shelf компилятор пишет что cop:=0; ни где не задействован, добавляю ещё один Segment:TSegment; тоже самое. Вот из-за этого сижу думаю, пробовал так и так)).
|
#9
|
|||
|
|||
форумчане препод вернул, вот что пишет Добавление: что определяет параметр index? Если номер ячейки массива, то это неправильно.
Я уже писал что массив должен содержать номера сегментов, причем - в произвольном порядке. Например: 23, 12, 44, 07, 10 ... Поэтому номер сегмента не обязан совпадать с номером ячейки массива, где он хранится. Надо организовать поиск сегмента с номером index (аналогично методу удаления), после чего сдвинуть ХВОСТОВУЮ часть вправо. Совет по методам работы с файлами. Самое простое решение - построчное хранение: записали в строку число сегментов, потом в цикле в ОТДЕЛЬНЫЕ строки - номер сегмента, число страниц и данные о каждой странице (все - в отдельные строки). Это упрощает обратную загрузку, т.к. не требуется разбор строк на отдельные составляющие. метод удаления: Код:
function TRam.DelSegment (TSegment: integer): integer; var i,j: integer; begin Result:=0; for i:=0 to GetCount-1 do if FRam[i].GetNum = TSegment then begin for j:=i to GetCount-1 do FRam[j]:= FRam[j+1]; Dec(FCount); if FCount< Length(FRam) div 2 then SetLength(FRam,FCount); Result:= TSegment; Exit; end; end; |