ďťż

Ł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
  •