![]() |
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 |
AW: Fehler im Programm
Delphi-Quellcode:
Ein Array mit einer Größe von 2 Gibibyte? :shock:
Var Gestrichen: ARRAY[2..2147483647] of BOOLEAN;
Wie wäre es, wenn du deine Zahlenmenge ein "klein wenig" reduzierst... |
AW: Fehler im Programm
Es funktioniert schon beim Array von 1..10 nicht. :cry:
|
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] |
AW: Fehler im Programm
Zitat:
|
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.
|
AW: Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwen
Zitat:
- 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 |
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. |
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 03:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz