Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
2-1201813420
flaxe
2008-02-01 00:03
2008.02.24
Динамическое создание объектов


15-1200664184
Evanescence
2008-01-18 16:49
2008.02.24
граббер в php


15-1200760407
Nobody
2008-01-19 19:33
2008.02.24
Помогите настроить домен


15-1200707661
Trial
2008-01-19 04:54
2008.02.24
Как сделать, чтобы много функций работало параллельно?


6-1180940537
DVM
2007-06-04 11:02
2008.02.24
Винет поток на функции Socket().





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский