Главная страница
    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.052 c
2-1201541016
Inslave
2008-01-28 20:23
2008.02.24
Ini + checbox


2-1201687303
Я
2008-01-30 13:01
2008.02.24
Как получить интервалы дат в неделях года


15-1201014410
oldman
2008-01-22 18:06
2008.02.24
DirectX версии 9.0c и выше.


2-1201712168
AlexanderMS
2008-01-30 19:56
2008.02.24
Как "разбить" 1 байт на 4 группы по 2 бита.


15-1200851799
Alex_xelA
2008-01-20 20:56
2008.02.24
Модель предметной области





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский