Avatar billede wip13 Nybegynder
19. maj 2005 - 09:35 Der er 3 kommentarer og
1 løsning

array som result fra function f***er

ARG!

jeg har:
------------------------------------------
type
  arrayofinteger = Array of Integer;

...blablabla

function KMPcompute(P:String):arrayofinteger;
var
  m,k,q:Integer;
  pi:arrayofinteger;
begin

  ShowMessage('start');
  SetLength(pi,Length(P));

  m := Length(P);
  pi[1] := 0;
  k := 0;
  For q:= 2 to m do;
  begin
    while (k>0) and (P[k+1] <> P[q]) do
      k := pi[k];
      if (P[k+1] = P[q])then
        k := k+1;
      pi[q] := k;
  end;
  Result := pi;
end;

function KMPpic(T:String;P:String):Integer;
var
  found : boolean;
  n,m,q,i:Integer;
  pi:arrayofinteger;
begin
  Result := -1;
  found := false;
  n := Length(T);
  m := Length(P);
  pi := KMPcompute(P);
  q := 0;
  i := 1;
  While (i< n+1) and (found = false) do
  begin
    while (q>0) and (P[q+1] <> T[i]) and (found = false) do
      q := pi[q];
    if(P[q+1] = T[i])then
      q := q+1;
    if(found = true) then
      ShowMessage('denne skulle ikke komme');
    if(q = m)then
    begin
      found := true;
      Result := i-m;
      q := pi[q];
    end;
  i := i+1;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(KMPpic('sfakhsafjhsfaludehsfajsdluderhkfahjsfahfsa','luder'));
end;
-----------------------------
og det virker.
Men fjerner jeg ShowMessage('start') (eller sætter den efter  SetLength(pi,Length(P));) går den helt i spåner med en:
EInvaliedPointer

hvad er det lige der sker? Og hvorfor må man ikke returnere arrays fra funktioner? ...
Avatar billede kroning Nybegynder
19. maj 2005 - 15:03 #1
Har du Range Checking slået til?
Jeg får en range check error når jeg kører koden:

For q:= 2 to m do;
Jeg går ud fra at det er en fejl at der er en ; efter do, dette betyder jo at linierne under for lykken ikke kaldes 2 til m antal gange.

Du skriver:
SetLength(pi,Length(P));
dvs. at du kan benytte P[0] til P[4] når P="luder", du skriver m := Length(P); og med en for For q:= 2 to m do kaldes pi[q] := k; på et tidspunkt hvor q=5 hvilket giver en Range check error.

Hvis jeg retter ovenstående får jeg ikke en EInvaliedPointer på noget tidspunkt.
Avatar billede wip13 Nybegynder
19. maj 2005 - 19:05 #2
ja det er mig der ikke har styr på mine arrays, svar og du skal få point
Avatar billede kroning Nybegynder
19. maj 2005 - 19:10 #3
Dvs. at det virker nu?
Avatar billede wip13 Nybegynder
19. maj 2005 - 19:12 #4
ye
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester