![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динимические массивы [D7, XP]
fics © (2008-01-22 12:54:00)Здравствуйте мастера.
Вобщем задача такая: есть список 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 рекурсивно и как то она неадекватно себя ведет, то удалет то нет казалось
бы в одной и той же ситуации, что то замуляло меня, помогите плз.
fics (2008-01-28 23:48:00) [1]Сергей М. помоги:)
ketmar (2008-01-28 12:50:00) [2]>[13] fics ©(28.01.08 12:43)
>почему за диапазон выходит непойму
потому что ошибка, вестимо. мы её за тебя искать не будем.
fics (2008-01-28 12:43:00) [3]
> ketmar ©
Да я занаю что он медленный, почему за диапазон выходит непойму, работает все у меня пока хорошо(даже замечательно), но люди пишут, что
когда работаеш без RangeCheckihg и OverflowCheckihg, в один прекрасный момент может наступить неприятная ситуация(к примеру при защите дипломки)
ketmar (2008-01-28 12:38:00) [4]>[11] fics ©(28.01.08 12:32)
читай [10].
также ещё хинт: медленней SetLength() только дискеты.
fics (2008-01-28 12:32:00) [5]Может вообще так нехорошо делать, как делаю я то есть
просто меняю длинну массива если есть дуга которую мне нужно удалить
я ей присваеваю следующую, а посреднюю "откусываю" Set-легом
ketmar (2008-01-28 12:28:00) [6]>[9] fics ©(28.01.08 12:25)
«вставка/удаление как можно быстрее с массивами» — это оксюморон.
fics (2008-01-28 12:25:00) [7]Здравствуйте, спасибо всем за ваши ответы, попробую через 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;
Sapersky (2008-01-24 15:25:00) [8]Что касается упрощения - и для массивов есть универсальные процедуры удаления-вставки:
http://www.rsdn.ru/article/Delphi/dynarrays.xml
http://sapersky.narod.ru/files/Arrays.rar
Хотя по скорости при удалении с сохранением порядка и вставке в середину быстрее как раз списки (в примере по второй ссылке есть сравнение с TList).
MsGuns (2008-01-24 10:33:00) [9]Если есть необходимость частого удаления-вставки в некоторое множество однотипных объектов, удобнее, ИМХО, вместо массивов использовать списки или коллекции - по времени исполнения возможен некоторый проигрыш, но код существенно упрощается
Сергей М. (2008-01-24 09:57:00) [10]Мне не понятно, зачем тут понадобилась рекурсия ?
Поясни ..
Oleg (2008-01-23 15:47:00) [11]А если так?
i := 0;
while not (i = LineCount) do
begin
if <удовлетворят условию удаления> then
begin
<удалить строку>
dec(LineCount);
SetLength(SpArray,2, LineCount);
end else
inc(i);
end;
fics (2008-01-22 13:47:00) [12]
> Сергей М. ©
> Предлагаешь отладить твой код вместо тебя самого ?
Могу и предложить, ну хотябы указать на ошибки?
Сергей М. (2008-01-22 13:31:00) [13]Понятно.
и что ?
Предлагаешь отладить твой код вместо тебя самого ?
fics (2008-01-22 13:07:00) [14]
> Сергей М. ©
Нет Графопостроилку, этот спискок это список дуг
Сергей М. (2008-01-22 13:03:00) [15]
> Вызаваю DelRecord рекурсивно
Древо что ли сотворяешь ?)