Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Динимические массивы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1200828041
Parus
2008-01-20 14:20
2008.02.24
PHP and mod_layout (help)


2-1201278587
Максим
2008-01-25 19:29
2008.02.24
форму трясет при движении


2-1201695689
Surok
2008-01-30 15:21
2008.02.24
Как сделать DateTimePicker пустым?


15-1201017444
sauron
2008-01-22 18:57
2008.02.24
BIOS?


15-1200675097
Lip
2008-01-18 19:51
2008.02.24
Переменная в процедуре .. живучая