Einzelnen Beitrag anzeigen

Görly

Registriert seit: 5. Apr 2008
29 Beiträge
 
Delphi 7 Enterprise
 
#1

entwickeltes boyer-moore program läuft nich

  Alt 7. Apr 2008, 20:02
hey, nun hab ich mich ja lang genug mit dem kmp algo rumgeschlagen das er endlich annähernd vorführbereit ist. jetz gehts an den boyer-moore algo. ich habe mal ein wenig rumprobiert und bin besher so weit gekommen:
Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    bt_neu: TButton;
    bt_ende: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    ed_suche: TEdit;
    Label2: TLabel;
    bt_start: TButton;
    bt_text: TButton;
    Label3: TLabel;
    Memo2: TMemo;
    procedure bt_endeClick(Sender: TObject);
    procedure bt_neuClick(Sender: TObject);
    //function BMsearch(Pat, Txt :string) : Longint;
    procedure bt_startClick(Sender: TObject);
    procedure bt_textClick(Sender: TObject);
 // procedure bt_textClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bt_endeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.bt_neuClick(Sender: TObject);
begin
memo1.clear;
memo2.Clear;
ed_suche.clear;
end;


                 //wort ,text
function BMsearch(Pat, Txt :string) : Longint;

 var Postable: array[0..255] of longint;
    Patlen : Longint; //länge des suchstrings
    txtlen : Longint; //gesamte länge text(anzahl der zeichen)
    index : longint; //um das was sich verschiebt
    patindex : Longint; //wort das gesucht wurde
    position : longint; //derzeitige position
    b : Byte; // Zähler das zeichenanzahl nicht überschritten wird
                           //aus array 255
     y : Boolean; //gesuchtes wort gefunden
     x : integer;
begin
  if pat = 'then
  begin
     BMsearch := 0;
     exit;
  end;
  x :=0; // kein wort gefunden da Anfang
  Patlen := Length(Pat);
  Txtlen := Length(txt);

  for b := 0 to 255 do
      postable[b] := -1;
      for patindex := 1 to Patlen do
          Postable[ord(Pat[Patindex])] := Patindex;

  index := 0;




  while (patindex > 0) and (index <= txtlen - patlen) do
    begin

       Patindex := Patlen;
         while (Pat[Patindex] = txt[index + Patindex]) and
              (patindex > 0) do
            //gefunden ergibt sich aus true
  if (Pat[Patindex] = txt[index + Patindex]) and (patindex > 0) then y := true;
     if y = true then x + 1;

          begin Dec(Patindex);
           if Patindex >0 then
              begin
              position := Postable[ord(txt[index + patindex])];


                if position = -1 then inc(index,Patindex)
                else if Position > Patindex then inc (index,1)
                else inc(index,patindex - Position);
              end;

        end;


  if Patindex =0 then BMsearch := index +1 else BMsearch :=0;


  end;
  end;



procedure TForm1.bt_startClick(Sender: TObject);

var
pat,txt : string;
begin
 BMsearch(Pat, Txt); // Zugriff auf Schleife

end;



procedure TForm1.bt_textClick(Sender: TObject);
begin
 memo1.lines.add
('hallo, wie geht es dir?');
end;

end.
könntet ihr mal drüberschaun und eventuell meinen fehler finden bzw. mir sagen das selbst der ansatz faltsch ist ?
ich habe soweit eigentlich nur noch ein problem mit der ausgabe. ich weis nicht wie ich die mache.

danke euch
greetz görly

[edit=SirThornberry]code-tags durch delphi-tags ersetzt - Mfg, SirThornberry[/edit]
Remo
  Mit Zitat antworten Zitat