![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посмотрите пожалуйста свежим взглядом!
pathfinder © (2005-09-02 21:24:00)Что-то ему не нравится в цикле 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.
Alexander Panov (2005-09-02 22:22:00) [1]pathfinder (02.09.05 22:20) [8]
Я думаю, что тебе просто нужно посмотреть свежим;) на функции Copy, Pos
pathfinder (2005-09-02 22:20:00) [2]Спасибо! Разобрался наконец таки)
Alexander Panov (2005-09-02 22:14:00) [3]Alexander Panov © (02.09.05 22:13) [6]
Length(s1)-1);
Это не обязательно, можно просто 10000
Alexander Panov (2005-09-02 22:13:00) [4]Для каждой строки в цикле по списку строк:
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;
pathfinder (2005-09-02 22:06:00) [5]
> Eraser ©
> Почему бы сразу не сказать ГДЕ конкретно в цикле вылетает
> ошибка...?
если бы я знал..просто без этого цикла ее нет
> Вообще код, мягко говоря, неуниверсальный )
а кто говорит, что это супер-код?)
> Alexander Panov ©
> 1. Отоформатируй как следует код - уважай тех, кто может
> помочь тебе.
старался как мог..простите, если что не так.
pathfinder (2005-09-02 22:03:00) [6]
> begin...end ©
Цикл для того, чтобы сдвигать символы начиная с 901 позиции на одну позицию влево до тех пор пока в поз. 900 не будет символа "/". Но почему-то не работает(
begin...end (2005-09-02 21:55:00) [7]> pathfinder (02.09.05 21:24)
> c:=900;
> repeat
> S[c]:=S[c+1];
> c:=c+1;
> until (S[900]='/');
Посмотрел свежим взглядом. Не понял, зачем здесь цикл. Он будет либо продолжаться до первого исключения из-за выхода за границы строки, либо выполнится один раз.
Alexander Panov (2005-09-02 21:40:00) [8]1. Отоформатируй как следует код - уважай тех, кто может помочь тебе.
2. Заметь, что строка может быть короче, чем(S[897]='/') and (S[900]='/')
Такие вещи надо контролировать, поэтому кроме тебя без исходных данных никто не отладит твой код.
Eraser (2005-09-02 21:38:00) [9]pathfinder (02.09.05 21:24)
в цикле repeat..until Вылезает ошибка
Почему бы сразу не сказать ГДЕ конкретно в цикле вылетает ошибка...?
Вообще код, мягко говоря, неуниверсальный )