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

Вниз

Посмотрите пожалуйста свежим взглядом!   Найти похожие ветки 

 
pathfinder   (2005-09-02 21:24) [0]

Что-то ему не нравится в цикле repeat..until Вылезает ошибка "Access violation at adress..."
procedure TForm1.Button1Click(Sender: TObject);
var
St:TStringList;
i, c, n, n1, n2:integer;
S:string;
begin
St:=TStringList.Create;
 if opendialog1.Execute then
  begin
   St.LoadFromFile(opendialog1.FileName);
   for i:=0 to St.Count-1 do
    begin
     S:=St.strings[i];
      if (S[897]="/") and (S[900]="/") then  
       begin
        //begin
         for n:=898 to 922 do
          begin
           S[n-1]:=S[n];
          end;
        //end;

        if (S[897]="M") and (S[899]="/") and (S[916]<>" ") then  
         begin
          for n1:=899 to 922 do
           begin
            S[n1-2]:=S[n1];
           end;
         end;

        if (S[897]="/") and (S[916]<>" ") then
         begin
          S[899]:=".";
          c:=900;
          repeat
          S[c]:=S[c+1];
          c:=c+1;
          until (S[900]="/");
         end;

       end;
     St.Strings[i]:=S;
    end;
  end;
St.SaveToFile("out.txt");
end;

end.


 
Eraser ©   (2005-09-02 21:38) [1]

pathfinder   (02.09.05 21:24)
в цикле repeat..until Вылезает ошибка


Почему бы сразу не сказать ГДЕ конкретно в цикле вылетает ошибка...?

Вообще код, мягко говоря, неуниверсальный )


 
Alexander Panov ©   (2005-09-02 21:40) [2]

1. Отоформатируй как следует код - уважай тех, кто может помочь тебе.
2. Заметь, что строка может быть короче, чем (S[897]="/") and (S[900]="/")

Такие вещи надо контролировать, поэтому кроме тебя без исходных данных никто не отладит твой код.


 
begin...end ©   (2005-09-02 21:55) [3]

> pathfinder   (02.09.05 21:24)

> c:=900;
> repeat
> S[c]:=S[c+1];
> c:=c+1;
> until (S[900]="/");

Посмотрел свежим взглядом. Не понял, зачем здесь цикл. Он будет либо продолжаться до первого исключения из-за выхода за границы строки, либо выполнится один раз.


 
pathfinder   (2005-09-02 22:03) [4]


> begin...end ©

Цикл для того, чтобы сдвигать символы начиная с 901 позиции на одну позицию влево до тех пор пока в поз. 900 не будет символа "/". Но почему-то не работает(


 
pathfinder   (2005-09-02 22:06) [5]


> Eraser ©  


> Почему бы сразу не сказать ГДЕ конкретно в цикле вылетает
> ошибка...?

если бы я знал..просто без этого цикла ее нет

> Вообще код, мягко говоря, неуниверсальный )

а кто говорит, что это супер-код?)


> Alexander Panov ©


> 1. Отоформатируй как следует код - уважай тех, кто может
> помочь тебе.

старался как мог..простите, если что не так.


 
Alexander Panov ©   (2005-09-02 22:13) [6]

Для каждой строки в цикле по списку строк:

s := List[i];
s1 := Copy(List[i],901,10000);
n := Pos("/",s1);
if n>0
  then List[i] := Copy(s,1,900)+Copy(s1,n,Length(s1)-1);
  else List[i] := Copy(s,1,900);
end;


 
Alexander Panov ©   (2005-09-02 22:14) [7]

Alexander Panov ©   (02.09.05 22:13) [6]
Length(s1)-1);

Это не обязательно, можно просто 10000


 
pathfinder   (2005-09-02 22:20) [8]

Спасибо! Разобрался наконец таки)


 
Alexander Panov ©   (2005-09-02 22:22) [9]

pathfinder   (02.09.05 22:20) [8]

Я думаю, что тебе просто нужно посмотреть свежим;) на функции Copy, Pos



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
14-1127306421
oldman
2005-09-21 16:40
2005.10.09
У кого стоит 1С? Проблемку поймал...


3-1124880664
Слава-АБС
2005-08-24 14:51
2005.10.09
Открытие Dbf через ADO


4-1123870237
_Seldon_
2005-08-12 22:10
2005.10.09
Не приходит LB_GETITEMRECT


8-1116596438
anat
2005-05-20 17:40
2005.10.09
openGL печать


4-1123597670
NeoMaster
2005-08-09 18:27
2005.10.09
Получение списка всех подкаталогов на всех логических дисках