Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwendung (https://www.delphipraxis.net/162629-zugriffs-verweigerung-bei-multiplikation-schleife-boolean-array-primzahl-anwendung.html)

Hermy667 31. Aug 2011 16:00


Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwendung
 
Nen Guten Tag wünsche ich,
Ich versuche für die Schule den "Sieb des Eratosthenes" zu programmieren.
Das hier ist mein Quellcode:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Var Untergrenze, Obergrenze, Zaehler1, Zaehler2, Zaehler3:INTEGER;
Var Gestrichen: ARRAY[2..2147483647] of BOOLEAN;
begin
    ListBox1.Clear;
    Untergrenze:=StrToInt(Edit1.Text);
    Obergrenze:=StrToInt(Edit2.Text);
      IF Untergrenze < Obergrenze
      Then Panel1.Caption:='Die Untergrenze darf die Obergrenze nicht überschreiten!'
      Else IF Obergrenze > 2147483647
           Then Panel1.Caption:='Die Obergrenze ist zu hoch! Sie darf maximal 2147483647 betragen.'
           Else IF Untergrenze < 2
                Then Panel1.Caption:='Die Untergrenze muss mindestens 2 betragen!'
                Else

                Gestrichen[2]:=false;
                   For Zaehler1:=2 TO 2147483647 DO
                     IF Gestrichen[Zaehler1]=false
                     Then FOR Zaehler2:=2 TO 46342 DO
                          Gestrichen[Zaehler1*Zaehler2]:=true;

          For Zaehler3:=Untergrenze TO Obergrenze DO
          IF Gestrichen[Zaehler3]=false
          Then ListBox1.Items.Add(IntToStr(Zaehler3));


end;

end.

Wenn ich das ausführe bekomme ich einen "Zugriffsfehler" Die Leiche liegt beim "Zaehler1*Zaehler2" begraben, doch warum will er das nicht?

Danke im Vorraus

jaenicke 31. Aug 2011 16:15

AW: Fehler im Programm
 
Delphi-Quellcode:
Var Gestrichen: ARRAY[2..2147483647] of BOOLEAN;
Ein Array mit einer Größe von 2 Gibibyte? :shock:
Wie wäre es, wenn du deine Zahlenmenge ein "klein wenig" reduzierst...

Hermy667 31. Aug 2011 16:43

AW: Fehler im Programm
 
Es funktioniert schon beim Array von 1..10 nicht. :cry:

DeddyH 31. Aug 2011 16:51

AW: Fehler im Programm
 
Kann es sein, dass da ein paar begins und ends fehlen?

[edit] Übrigens: Präzisiere doch bitte den Thread-Titel, damit man ungefähr weiß, worum es geht. [/edit]

Luckie 31. Aug 2011 17:33

AW: Fehler im Programm
 
Zitat:

Zitat von DeddyH (Beitrag 1120711)
Übrigens: Präzisiere doch bitte den Thread-Titel, damit man ungefähr weiß, worum es geht.

Hier noch mal offiziell die Aufforderung von mir in meiner Funktion als Moderator. Wegen Fehler im Programm melden sich am Tag ein zwei Mitglieder. ;)

Bjoerk 31. Aug 2011 18:14

AW: Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwen
 
Ja, ein begin/end fehlt wohl und Zaehler1*Zaehler2 überschreitet wahrscheinlich maxint. Zaehler1 soll wohl 46342 sein.

himitsu 31. Aug 2011 18:19

AW: Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwen
 
Zitat:

Zitat von Bjoerk (Beitrag 1120738)
und Zaehler1*Zaehler2 überschreitet wahrscheinlich maxint. Zaehler1 soll wohl 46342 sein.

Projektoptionen:
- Indexprüfung aktivieren > prüft, ob mathematische Berechnungen und Zuweisungen innerhalb des möglichen Wertebereichs liegen
- Bereichsprüfung aktivieren > prüft, ob der Zugriff auf Arrays innnerhalb des vorhandenen Indexbereichs liegt

Hermy667 31. Aug 2011 18:33

AW: Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwen
 
Ich habe noch einmal den QUelltext überarbeitet. Es funktioniert immernoch nicht wegen des selben Grundes. :(

unit Unit1;

interface

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

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
Var Untergrenze, Obergrenze, Zaehler1, Zaehler2, Zaehler3:INTEGER;
Var Gestrichen: ARRAY[2..200] of BOOLEAN;
begin
ListBox1.Clear;
Untergrenze:=StrToInt(Edit1.Text);
Obergrenze:=StrToInt(Edit2.Text);
IF Untergrenze < Obergrenze
Then Panel1.Caption:='Die Untergrenze darf die Obergrenze nicht überschreiten!'
Else IF Obergrenze > 200
Then Panel1.Caption:='Die Obergrenze ist zu hoch! Sie darf maximal 200 betragen.'
Else IF Untergrenze < 2
Then Panel1.Caption:='Die Untergrenze muss mindestens 2 betragen!'
Else
Begin For Zaehler1:=2 TO 200 DO
Gestrichen[Zaehler1]:=false
end;
Begin
For Zaehler1:=2 TO 200 DO
IF Gestrichen[Zaehler1]=false
Then FOR Zaehler2:=2 TO 50 DO
Gestrichen[Zaehler1*Zaehler2]:=true;
End ;
Begin
For Zaehler3:=Untergrenze TO Obergrenze DO
IF Gestrichen[Zaehler3]=false
Then ListBox1.Items.Add(IntToStr(Zaehler3));
End;

end;

end.

Bjoerk 31. Aug 2011 18:34

AW: Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwen
 
Soll wohl irgendwie sowas sein, sieht nach Primzahlberechnung o.ä. aus !?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  maxZ = 100;
  maxN = 10000; // maxZ*maxZ
var
  Untergrenze, Obergrenze, I, J, K: integer;
var
  Gestrichen: array [2..MaxN] of boolean;
begin
  Untergrenze:= StrToInt(Edit1.Text);
  Obergrenze:= StrToInt(Edit2.Text);
  Panel1.Caption:= '';
  if Untergrenze > Obergrenze then
    Panel1.Caption:= 'Die Untergrenze darf die Obergrenze nicht überschreiten.'
  else
    if Obergrenze > maxZ then
      Panel1.Caption:= 'Die Obergrenze ist zu hoch. Sie darf maximal '+IntToStr(maxZ)+' betragen.'
    else
      if Untergrenze < 2 then
        Panel1.Caption:= 'Die Untergrenze muss mindestens 2 betragen.'
      else
      begin
        Gestrichen[2]:= false;
        for I:= 2 to maxZ do
          if not Gestrichen[I] then
            for J:= 2 to maxZ do Gestrichen[I*J]:= true;
        ListBox1.Clear;
        ListBox1.Items.BeginUpdate;
        for K:= Untergrenze to Obergrenze do
          if not Gestrichen[K] then ListBox1.Items.Add(IntToStr(K));
        ListBox1.Items.EndUpdate;
      end;
end;

Alternative:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Untergrenze, Obergrenze, I, J, K: integer;
  Result: boolean;
begin
  Untergrenze:= StrToInt(Edit1.Text);
  Obergrenze:= StrToInt(Edit2.Text);
  ListBox1.Clear;
  ListBox1.Items.BeginUpdate;
  for I:= Untergrenze to Obergrenze do
  begin
    Result:= true;
    for J:= 2 to Obergrenze do
    begin
      if not Result then Break;
      for K:= 2 to Obergrenze do
      begin
        if not Result then Break;
        if I = J*K then Result:= false;
      end;
    end;
    if Result then ListBox1.Items.Add(IntToStr(I));
  end;
  ListBox1.Items.EndUpdate;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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