Avatar billede Bjarne Novice
15. november 2006 - 18:51 Der er 9 kommentarer og
2 løsninger

Pascals trekant

God aften

Jeg sidder og roder med Delphi 7, fordi jeg gerne vil beregne værdierne i Pascals trekant: http://peecee.dk/resize.php?id=12299

Desværre får jeg fejl når jeg kører min kode: Projekt projekt2.exe raised exception class EAccessViolation with message 'access violation at adress 00404C4D in module projekt2.exe'. Read of adress 00000016'. Process stopped. Use Step or Run to continue

Her er min procedure:

procedure lavtabel(n: integer);
var
  i,u: integer;
begin
  //sæt antal kolonner givet ved n
  setlength(table, n);

  //sæt antal rækker givet ved n+1
  for i:=0 to n do setlength(table[i], n+1);

  //indsæt værdier
  table[0,0]:=1;
  table[1,0]:=1;
  table[1,1]:=1;

  for i:=2 to n do
  begin
    for u:=0 to n+1 do
    begin
      //hvis vi er på enten første eller sidste plads, er værdien 1
      //ellers regnes værdien fra ovenstående række
      if (u=0) OR (u=length(table[i])) then table[i,u]:=1
      else table[i,u]:= table[i-1, u-1] + table[i-1, u];
    end;
  end;
end;

Jeg kalder proceduren: lavtabel(2);. Håber nogle kan hjælpe - er ikke så stærk til Delphi.
Avatar billede Bjarne Novice
15. november 2006 - 19:09 #1
har lavet et multi-dimensionalt array: table: Array of Array of byte;
Avatar billede miqe Nybegynder
16. november 2006 - 00:52 #2
For n lig 2 vil i være 2 igennem hele din anden for-løkke.
Ved sidste gennemløb af tredje for-løkke vil u være lige 3.
3!=0
3=length(table[2]) da 3=3
table[2,3] sættes lig 1.
Problemet er at table[2,3] ligger udenfor dit array.

Du bør ændre:
for i:=0 to n do setlength(table[i], n+1);
til:
for i:=0 to n do setlength(table[i], i+1);
og:
for u:=0 to n+1 do
til:
for u:=0 to n do
Avatar billede Bjarne Novice
16. november 2006 - 17:55 #3
Jeg har forsøgt, at ændre det du siger, men det virker desværre stadig ikke. Jeg får samme fejl som før.

procedure lavtabel(n: integer);
var
  i,u: integer;
begin
  //sæt antal kolonner givet ved n
  setlength(table, n);

  //sæt antal rækker givet ved n+1
  for i:=0 to n do setlength(table[i], i+1);

  //indsæt værdier
  table[0,0]:=1;
  table[1,0]:=1;
  table[1,1]:=1;

  for i:=2 to n do
  begin
    for u:=0 to n do
    begin
      //hvis vi er på enten første eller sidste plads, er værdien 1
      //ellers regnes værdien fra ovenstående række
      if (u=0) OR (u=length(table[i])) then table[i,u]:=1
      else table[i,u]:= table[i-1, u-1] + table[i-1, u];
    end;
  end;
end;
Avatar billede miqe Nybegynder
17. november 2006 - 10:02 #4
Prøv at sætte et breakpoint ind efter "begin" i for-løkken "for i:=....."
Når den stopper op, kan du forsøge at steppe dig igennem en linie ad gangen og se hvornår fejlen opstår.
Når du ved dette, har vi afgrænset problemet.
Avatar billede Bjarne Novice
17. november 2006 - 16:46 #5
hvad er et breakpoint helt præcist? - jeg er desværre ikke så stærk til delphi
Avatar billede miqe Nybegynder
17. november 2006 - 18:44 #6
Et breakpoint er en funktion i dit programmeringsmiljø.
Funktionen findes i de fleste større programmeringsmiljøer, som et værktøj til Debugin (ikke kun i Delphi).
Muligvis har du en menu der hedder "Run", "Debug" eller noget lignende. Det skulle i hvert fald være muligt at finde det via menuerne i din editor.

Et breakpoint er et punkt i din kode, hvor dit programmeringsmiljø slår bremsen i, så dit program står stille og afventer din interaktion.
Herfra skulle det være muligt at få miljøet til at steppe sig frem i programmet linie for linie indtil du rammer fejlen. Når du rammer fejlen ved du vilken linie der forårsager den.
Avatar billede kroning Nybegynder
19. november 2006 - 19:25 #7
Jeg har lavet en del om i den men nu virker det:

var
  table: Array of Array of integer;

med integer kan du lave op til 34 rækker
-----------------

procedure lavtabel(n: integer);
var
  i,u: integer;
begin
  //sæt antal kolonner givet ved n
  setlength(table, n);

  //sæt antal rækker givet ved i+1
  for i:=0 to n-1 do setlength(table[i], i+1);

  //indsæt værdier
  table[0,0]:=1;
  table[1,0]:=1;
  table[1,1]:=1;

  for i:=2 to n-1 do
  begin
    for u:=0 to i do
    begin
      //hvis vi er på enten første eller sidste plads, er værdien 1
      //ellers regnes værdien fra ovenstående række
      if (u=0) or (u=length(table[i])-1) then
          table[i,u]:=1
      else
          table[i,u]:= table[i-1, u-1] + table[i-1, u];
    end;
  end;
end;

---------------------

jeg bruge denne til at test, den skriver rækkerne ud til Memo1

procedure TForm1.Button2Click(Sender: TObject);
var
    i,u : integer;
  o : string;
begin
    for i:=0 to length(table)-1 do
  begin
      o:='';
        for u:=0 to i do
            o:=o+' '+inttostr(table[i,u]);
        memo1.Lines.Add(o);
  end;
end;
Avatar billede kroning Nybegynder
19. november 2006 - 19:30 #8
ok, hvis jeg lige læser hvad mige skrev så har jeg kun lavet lidt om i forhold til det.
Avatar billede Bjarne Novice
22. november 2006 - 19:38 #9
Tusind tak til Jer begge.. Smid et svar, hvis I vil have point
Avatar billede kroning Nybegynder
22. november 2006 - 19:47 #10
k
Avatar billede miqe Nybegynder
22. november 2006 - 22:04 #11
Svar
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