Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [fixed] Array Dimension überschritten (https://www.delphipraxis.net/36060-%5Bfixed%5D-array-dimension-ueberschritten.html)

Orbmu2k 15. Dez 2004 10:28


[fixed] Array Dimension überschritten
 
Wollte mal den PrimeCode von Sakura mit int64 bauen ... aber irschendwas ist da faul :(


Warum bekomm ich hier ne Zugriffsverletzung ?


Delphi-Quellcode:
var
  PrimeGrid: array of Boolean;

implementation

{ TPrimeThread }

procedure TPrimeThread.CalcPrimes(EndNum: Int64);
var
  NotAPrime, CurrPrimeCandidate: Int64;
begin
  CurrPrimeCandidate := 2;
  SetLength(PrimeGrid,EndNum+1);
  FillChar(PrimeGrid, SizeOf(PrimeGrid), #1);
  PrimeGrid[1] := False;
  while (CurrPrimeCandidate < EndNum) do
  begin

   
    // Hab das hiermit mal debugt und es tritt genau bei dem Wert auf
    if CurrPrimeCandidate = 7126783 then
    begin
      asm
       int 3
      end;
    end;


    if PrimeGrid[CurrPrimeCandidate] then // hier Zugriffsverletzung wenn CurrPrimeCandidate = 7126783
    begin
      NotAPrime := CurrPrimeCandidate * 2;
      while NotAPrime <= EndNum do
      begin
        PrimeGrid[NotAPrime] := False;
        Inc(NotAPrime, CurrPrimeCandidate);
      end;
    end;
    CurrPrimeCandidate := CurrPrimeCandidate + 1;
  end;

end;

procedure TPrimeThread.Execute;
begin
  CalcPrimes(10000000);
end;

Orbmu2k 15. Dez 2004 11:15

Re: Warum Zugriffsverletzung
 
Ok habs hinbekommen ...

Hing wohl massgeblich am GetMem ;-)

Delphi-Quellcode:
var
  PrimeGrid: array of Boolean;

implementation

{ TPrimeThread }

procedure TPrimeThread.CalcPrimes(EndNum: Int64);
var
  NotAPrime, CurrPrimeCandidate: Int64;
begin
  CurrPrimeCandidate := 0;

  GetMem(PrimeGrid,EndNum+1);
  SetLength(PrimeGrid,EndNum+1);

  while (CurrPrimeCandidate < EndNum) do
  begin
    PrimeGrid[CurrPrimeCandidate] := True;
    CurrPrimeCandidate := CurrPrimeCandidate + 1;
  end;

  PrimeGrid[1] := False;
  CurrPrimeCandidate := 2;

  while (CurrPrimeCandidate < EndNum) do
  begin

    if PrimeGrid[CurrPrimeCandidate] then
    begin
      NotAPrime := CurrPrimeCandidate * 2;
      while NotAPrime <= EndNum do
      begin
        PrimeGrid[NotAPrime] := False;
        NotAPrime := NotAPrime + CurrPrimeCandidate;
      end;
    end;

    CurrPrimeCandidate := CurrPrimeCandidate + 1;
  end;

end;

procedure TPrimeThread.Execute;
begin
  CalcPrimes(300000000);
end;

ibp 15. Dez 2004 11:33

Re: Warum Zugriffsverletzung
 
wie wäre es mit einem gescheiten titel?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz