Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> алгоритм Бойера-Мура, помогите решить? 
:(
    Опции темы
BenLainus
Дата 16.2.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



Помогите плииииизз!!! 
Хотел написать прогу для поиска фрагментов строк по шаблону в тексте, с помощью алгоритма Бойера-Мура. 
Вот чё получилось:
Цитата

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    mmo2: TMemo;
    edt1: TEdit;
    lbl1: TLabel;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
type
  TIntVect = array [0..255] of Integer;
  TBMTable = array [0..0] of TIntVect;
  PBMTable = ^TBMTable;
function WCBeginsWith( const P, S : String) : Boolean;

var
  i, lp : Integer;
begin
  Result := False;
  lp := Length(P);
  if lp > Length(S) then Exit;
  for i := 1 to lp do
  if (P[i]<>S[i]) and (P[i]<>'?') and (S[i]<>'?') then Exit;
  Result := True;
end;
function WCFindRightmost( const S, P : String;
  l : Integer) : Integer;
var
  i, j, lp : Integer;
begin
  Result := 0;
  lp := Length(P);
  if lp > l then Exit;
  for i := l - lp + 1 downto 1 do
  for j := 1 to lp do
  if (P[j]<>S[i+j-1]) and (P[j]<>'?') and (S[i+j-1]<>'?') 
  then Break
  else if j = lp then
  begin
    Result := i;
    Exit;
  end;
end;
procedure WCMakeBMTable( var BMT : PBMTable;
  const P : String);
var
  i, j, lp, MaxShift, CurShift, SufPos : Integer;
  Suffix : String;
begin
  lp := Length(P);
  GetMem(BMT, SizeOf(TIntVect)*lp);
  if P[lp] = '?' then
  for i := 0 to 255 do BMT^[lp-1][i] := 0
  else
  begin
    for i := 0 to 255 do BMT^[lp-1][i] := lp;
    for i := lp downto 1 do
    if BMT^[lp-1][Byte(P[i])] = lp then
    BMT^[lp-1][Byte(P[i])] := lp - i;
  end;
  MaxShift := lp;
  for i := lp - 1 downto 1 do
  begin
    SetLength(Suffix, lp - i);
    Move(P[i+1], Suffix[1], lp - i);
    if WCBeginsWith(Suffix, P) then MaxShift := i;
    if P[i] = '?' then for j := 0 to 255 do BMT^[i-1][j] := 0
    else for j := 0 to 255 do
    begin
      CurShift := MaxShift;
      SetLength(Suffix, lp - i + 1);
      Suffix[1] := Char(j);
      Move(P[i + 1], Suffix[2], lp - i );
      SufPos := WCFindRightmost(P, Suffix, lp - 1);
      if SufPos <> 0 then
      CurShift := i - SufPos;
      BMT^[i-1][j] := CurShift;
    end;
    BMT^[i-1][Byte(P[i])] := 0;
  end;
  end;
function BMSearch( StartPos, lp : Integer; const S : String;
  BMT : PBMTable) : Integer;
var
  Pos, i : Integer;
begin
  Pos := StartPos + lp -1;
  while Pos < Length(S) do
  for i := lp downto 1 do
  if BMT^[i-1][Byte(S[Pos-lp+i])] <> 0 then
  begin
    Pos := Pos + BMT^[i-1][Byte(S[Pos-lp+i])];
    Break;
  end
  else if i = 1 then
  begin
    bmsearch := Pos - lp + 1;

  Exit;
  end;
  bmsearch := 0;

end;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
  var s,p: string; i: integer;
begin
  s:=mmo1.text;
  p:= edt1.text;

mmo2.Lines.Add(inttostr(BMSearch(1,s,p)));

end;
end.



В стоке «mmo2.Lines.Add(inttostr(BMSearch(1,s,p)));»  выдаёт такую ошибку: «Incompatinle types: Integer and String»
PM MAIL   Вверх
Letov
Дата 16.2.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



Цитата

function BMSearch( StartPoslp : Integer; const S : String;
  BMT : PBMTable) : Integer;

mmo2.Lines.Add(inttostr(BMSearch(1,s,p)));



Первые два аргумента функции должны быть типа Integer, один аргумент типа String и один типа PBMTable.
У Вас в вызове функции указаны 1 аргумент типа Integer, потом два аргумента типа String.
Несоответствие описанию функции в типе аргументов и их количестве.

Это сообщение отредактировал(а) Letov - 16.2.2010, 18:43


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
BenLainus
Дата 16.2.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



А как это исправить?
PM MAIL   Вверх
Letov
Дата 16.2.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



Цитата(BenLainus @ 16.2.2010,  20:20)
А как это исправить?

Вам необходимо вызвать функцию BMSearch с четырьмя параметрами. 2 типа Integer, один типа string и один типа PBMTable соответственно. За что конкретно данные параметры отвечают необходимо посмотреть в документации (описании) функции BMSearch.


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
BenLainus
Дата 16.2.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



Ясно, большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.