Ĺadny brzuch
Mam taki kodzio, który umieszczam pod spodem. Program napisany na szybko ma z wczytanego pliku wczytać linijki, potem pod przyciskiem uruchamia się procedura, która przeżuca z pierwszego do drugiego memo te frazy, które się niepowtarzają, i niekończą się na 'a' lub 'A'. I kolejny przycisk do zapisywania.
Błąd pojawia się podczas pracy programu. w Memo1 jest DUUUUUŻO linijek. Po przeanalizowaniu tak z 10% pojawia się błąd dostępu przy czytaniu FFFFF(dużo tych F ale ile nie liczyłem).
Proszę o pomoc w zlokalizowaniu błędu, lub przesłanie na e-mail podobnego działającego programu.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Memo2: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; P1 : TextFile; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var S : String; I : Integer; begin Form1.Memo1.Lines.LoadFromFile('C:\Documents and Settings\Mariusz\Pulpit\nazwiska.txt'); end; procedure TForm1.Button1Click(Sender: TObject); begin Form1.Memo2.Lines.SaveToFile('C:\Documents and Settings\Mariusz\Pulpit\POP.txt'); end; procedure TForm1.Button2Click(Sender: TObject); var L : Integer; L2 : Integer; begin L2 := 1; try for L := 1 to Form1.Memo1.Lines.Count do begin if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'a') or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'A') then begin Inc(L2); end else begin Form1.Memo2.Lines.Add(Form1.Memo1.Lines.Strings[L]); L2 := 1; end; end; except Exit; end; end; end.
Nie jestem fanem wklejania kodu, no ale bez kodu to chyba nie da rady tego błędu zlokalizować :(
//Oczywiście na TRY po błędzie program pracuje dalej, tylko przerywa procedurę, i program niema sensu :(
Użytkownik mariuszlorenc edytował ten post 03 listopad 2005, 20:49
Sprobuj wstawic:
if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L2]) or
zamiast:
if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or
Nie mam czasu dokładniej analizować Twojego kodu - ale póki co, to sprawdź sobie dokładniej czy nie wyłazisz gdzieś poza zakres z indeksami.
Np. nie ma w Memo1 elementu o indeksie Memo1.Lines.Count (numeracja jest od 0 do Count-1).
if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'a') or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'A') then begin Inc(L2); end
Zauwaz, ze gdy na koncu linii jest a lub A wtedy niepotrzebnie zwieksza sie L2 - sprobuj zrobic odzielnego ifa dla liter 'a' i 'A' i dla powtarzajacych sie linii...
Użytkownik Kajetanek edytował ten post 03 listopad 2005, 21:47
~
Mógłbyś gdzieś wysłać plik pop.txt?
Spróbuj czegoś takiego:
procedure przepisz; var  i: Integer;  s: String; begin  Memo2.Lines.BeginUpdate;  try   Memo2.Clear;   for i := 0 to Memo1.Lines.Count - 1 do   begin    s := Memo1.Lines[i];    if s <> '' then     if (Memo2.Lines.IndexOf(s) = -1) and (UpperCase(s)[Length(s)] <> 'A') then      Memo2.Lines.Add(s);   end;  finally   Memo2.Lines.EndUpdate;  end end;
Pisałem z głowy, ale myślę, że powinno zadziałać :)
Użytkownik Kokoszek edytował ten post 04 listopad 2005, 09:03
Zauwaz, ze gdy na koncu linii jest a lub A wtedy niepotrzebnie zwieksza sie L2 - sprobuj zrobic odzielnego ifa dla liter 'a' i 'A' i dla powtarzajacych sie linii...
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Błąd pojawia się podczas pracy programu. w Memo1 jest DUUUUUŻO linijek. Po przeanalizowaniu tak z 10% pojawia się błąd dostępu przy czytaniu FFFFF(dużo tych F ale ile nie liczyłem).
Proszę o pomoc w zlokalizowaniu błędu, lub przesłanie na e-mail podobnego działającego programu.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Memo2: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; P1 : TextFile; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var S : String; I : Integer; begin Form1.Memo1.Lines.LoadFromFile('C:\Documents and Settings\Mariusz\Pulpit\nazwiska.txt'); end; procedure TForm1.Button1Click(Sender: TObject); begin Form1.Memo2.Lines.SaveToFile('C:\Documents and Settings\Mariusz\Pulpit\POP.txt'); end; procedure TForm1.Button2Click(Sender: TObject); var L : Integer; L2 : Integer; begin L2 := 1; try for L := 1 to Form1.Memo1.Lines.Count do begin if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'a') or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'A') then begin Inc(L2); end else begin Form1.Memo2.Lines.Add(Form1.Memo1.Lines.Strings[L]); L2 := 1; end; end; except Exit; end; end; end.
Nie jestem fanem wklejania kodu, no ale bez kodu to chyba nie da rady tego błędu zlokalizować :(
//Oczywiście na TRY po błędzie program pracuje dalej, tylko przerywa procedurę, i program niema sensu :(
Użytkownik mariuszlorenc edytował ten post 03 listopad 2005, 20:49
Sprobuj wstawic:
if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L2]) or
zamiast:
if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or

Nie mam czasu dokładniej analizować Twojego kodu - ale póki co, to sprawdź sobie dokładniej czy nie wyłazisz gdzieś poza zakres z indeksami.
Np. nie ma w Memo1 elementu o indeksie Memo1.Lines.Count (numeracja jest od 0 do Count-1).

if (Form1.Memo1.Lines.Strings[L] = Form1.Memo1.Lines.Strings[L - L2]) or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'a') or (Form1.Memo1.Lines.Strings[L][Length(Form1.Memo1.Lines.Strings[L])] = 'A') then begin Inc(L2); end
Zauwaz, ze gdy na koncu linii jest a lub A wtedy niepotrzebnie zwieksza sie L2 - sprobuj zrobic odzielnego ifa dla liter 'a' i 'A' i dla powtarzajacych sie linii...
Użytkownik Kajetanek edytował ten post 03 listopad 2005, 21:47
~

Mógłbyś gdzieś wysłać plik pop.txt?
Spróbuj czegoś takiego:
procedure przepisz; var  i: Integer;  s: String; begin  Memo2.Lines.BeginUpdate;  try   Memo2.Clear;   for i := 0 to Memo1.Lines.Count - 1 do   begin    s := Memo1.Lines[i];    if s <> '' then     if (Memo2.Lines.IndexOf(s) = -1) and (UpperCase(s)[Length(s)] <> 'A') then      Memo2.Lines.Add(s);   end;  finally   Memo2.Lines.EndUpdate;  end end;
Pisałem z głowy, ale myślę, że powinno zadziałać :)
Użytkownik Kokoszek edytował ten post 04 listopad 2005, 09:03
Zauwaz, ze gdy na koncu linii jest a lub A wtedy niepotrzebnie zwieksza sie L2 - sprobuj zrobic odzielnego ifa dla liter 'a' i 'A' i dla powtarzajacych sie linii...
