Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
ВнизДинимические массивы Найти похожие ветки
← →
fics © (2008-01-22 12:54) [0]Здравствуйте мастера.
Вобщем задача такая: есть список 2 на n(SpArray 2 на n), к примеру такой:
1 2
1 3
2 3
2 4
2 9
Хочу из него удаль какую то строку(к примеру 2 3) делаю так, если
SpArray[0,i]=2 и (SpArray[1,i]=3)
Ну вот код:
if LineCount=0 then Exit;
if (LineCount=1)and(SpArray[0,0]=SpBuf[1])
and(SpArray[1,0]=SpBuf[2]) then begin
LineCount:=0;
SetLength(SpArray,0,0);
Exit;
end;
if (LineCount>1)and(SpArray[0,LineCount-1]=SpBuf[1])
and(SpArray[1,LineCount-1]=SpBuf[2]) then begin
LineCount:=LineCount-1;
SetLength(SpArray,2,LineCount);
Exit;
end;
for i:=0 to LineCount-2 do begin
if(SpArray[0,i]=SpBuf[1])and(SpArray[1,i]=SpBuf[2])then
begin
for j:=i to LineCount-2 do
begin
SpArray[0,j]:=SpArray[0,j+1];
SpArray[1,j]:=SpArray[1,j+1];
end;
LineCount:=LineCount-1;
SetLength(SpArray,2,LineCount);
Exit;
end;
end;
Так я удаляю только одну строку(это тоже нужно в программе), с этим проблем не протестил
работает нормально.
Нужна еще вот такая задача
(если какой то елемент в строке = SendTg, значит удалить эти строки)
вот код
procedure TMainF.DelRecord;
var
i,j:integer;
begin
for i:=0 to Pred(LineCount) do begin
if LineCount>=1 then begin
if (SpArray[0,i]=SendTg) or (SpArray[1,i]=SendTg)
then begin
for j:=i to Pred(LineCount)do begin
SpArray[0,j]:=SpArray[0,j+1];//Cдесь плохо наверно
SpArray[1,j]:=SpArray[1,j+1];
end;
LineCount:=LineCount-1;
SetLength(SpArray,2,LineCount);
DelRecord;
end;
if LineCount<1 then begin
SetLength(SpArray,0,0);
Exit;
end;
end;
Вызаваю DelRecord рекурсивно и как то она неадекватно себя ведет, то удалет то нет казалось
бы в одной и той же ситуации, что то замуляло меня, помогите плз.
← →
Сергей М. © (2008-01-22 13:03) [1]
> Вызаваю DelRecord рекурсивно
Древо что ли сотворяешь ?)
← →
fics © (2008-01-22 13:07) [2]
> Сергей М. ©
Нет Графопостроилку, этот спискок это список дуг
← →
Сергей М. © (2008-01-22 13:31) [3]Понятно.
и что ?
Предлагаешь отладить твой код вместо тебя самого ?
← →
fics © (2008-01-22 13:47) [4]
> Сергей М. ©
> Предлагаешь отладить твой код вместо тебя самого ?
Могу и предложить, ну хотябы указать на ошибки?
← →
Oleg © (2008-01-23 15:47) [5]А если так?
i := 0;
while not (i = LineCount) do
begin
if <удовлетворят условию удаления> then
begin
<удалить строку>
dec(LineCount);
SetLength(SpArray,2, LineCount);
end else
inc(i);
end;
← →
Сергей М. © (2008-01-24 09:57) [6]Мне не понятно, зачем тут понадобилась рекурсия ?
Поясни ..
← →
MsGuns © (2008-01-24 10:33) [7]Если есть необходимость частого удаления-вставки в некоторое множество однотипных объектов, удобнее, ИМХО, вместо массивов использовать списки или коллекции - по времени исполнения возможен некоторый проигрыш, но код существенно упрощается
← →
Sapersky (2008-01-24 15:25) [8]Что касается упрощения - и для массивов есть универсальные процедуры удаления-вставки:
http://www.rsdn.ru/article/Delphi/dynarrays.xml
http://sapersky.narod.ru/files/Arrays.rar
Хотя по скорости при удалении с сохранением порядка и вставке в середину быстрее как раз списки (в примере по второй ссылке есть сравнение с TList).
← →
fics © (2008-01-28 12:25) [9]Здравствуйте, спасибо всем за ваши ответы, попробую через TList и
универсальные процедуры удаления-вставки(но со вставкой уже и так разобрался своими способами), но нужно чтобы это удаление происходило как можно быстрее (потому что список большой), сделал так(код ниже), все работает вроде замечательно, только выставил у проеката в Options->Compiler->RangeCheckihg и OverflowCheckihg
и выдает ошибку что где то выходим за диапазон
но почему непойму(там ниже я поясню по коду)
// процедура удаления ребра из списка дуг
procedure TMainF.DelRecord;
var
i,j:integer;
begin
if LineCount=0 then Exit;
if ((SpArray[0,LineCount-1]=SendTg)or
(SpArray[1,LineCount-1]=SendTg)) then begin
LineCount:=LineCount-1;
SetLength(SpArray,2,LineCount);
DelRecord;
end;
for i:=0 to LineCount-2 do begin
if (LineCount>1)and((SpArray[0,i]=SendTg) or (SpArray[1,i]=SendTg))
then begin
for j:=i to LineCount-2 do begin
SpArray[0,j]:=SpArray[0,j+1];\\вот здесь, но J же больше 1 а J+1 не
SpArray[1,j]:=SpArray[1,j+1];\\ за придалетлы не должно выходить
\\так как LineCount-2 а не LineCount-1 end;
LineCount:=LineCount-1;
SetLength(SpArray,2,LineCount);
DelRecord;
end;
end;
end;
← →
ketmar © (2008-01-28 12:28) [10]>[9] fics ©(28.01.08 12:25)
«вставка/удаление как можно быстрее с массивами» — это оксюморон.
← →
fics © (2008-01-28 12:32) [11]Может вообще так нехорошо делать, как делаю я то есть
просто меняю длинну массива если есть дуга которую мне нужно удалить
я ей присваеваю следующую, а посреднюю "откусываю" Set-легом
← →
ketmar © (2008-01-28 12:38) [12]>[11] fics ©(28.01.08 12:32)
читай [10].
также ещё хинт: медленней SetLength() только дискеты.
← →
fics © (2008-01-28 12:43) [13]
> ketmar ©
Да я занаю что он медленный, почему за диапазон выходит непойму, работает все у меня пока хорошо(даже замечательно), но люди пишут, что
когда работаеш без RangeCheckihg и OverflowCheckihg, в один прекрасный момент может наступить неприятная ситуация(к примеру при защите дипломки)
← →
ketmar © (2008-01-28 12:50) [14]>[13] fics ©(28.01.08 12:43)
>почему за диапазон выходит непойму
потому что ошибка, вестимо. мы её за тебя искать не будем.
← →
fics © (2008-01-28 23:48) [15]Сергей М. помоги:)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c