AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwendung

Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwendung

Ein Thema von Hermy667 · begonnen am 31. Aug 2011 · letzter Beitrag vom 31. Aug 2011
Antwort Antwort
Hermy667

Registriert seit: 31. Aug 2011
3 Beiträge
 
#1

Zugriffs Verweigerung bei Multiplikation in Schleife Boolean Array Primzahl Anwendung

  Alt 31. Aug 2011, 16:00
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

Geändert von Hermy667 (31. Aug 2011 um 17:57 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Fehler im Programm

  Alt 31. Aug 2011, 16:15
Var Gestrichen: ARRAY[2..2147483647] of BOOLEAN; Ein Array mit einer Größe von 2 Gibibyte?
Wie wäre es, wenn du deine Zahlenmenge ein "klein wenig" reduzierst...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Hermy667

Registriert seit: 31. Aug 2011
3 Beiträge
 
#3

AW: Fehler im Programm

  Alt 31. Aug 2011, 16:43
Es funktioniert schon beim Array von 1..10 nicht.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Fehler im Programm

  Alt 31. Aug 2011, 16:51
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (31. Aug 2011 um 17:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Fehler im Programm

  Alt 31. Aug 2011, 17:33
Ü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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 31. Aug 2011, 18:14
Ja, ein begin/end fehlt wohl und Zaehler1*Zaehler2 überschreitet wahrscheinlich maxint. Zaehler1 soll wohl 46342 sein.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 31. Aug 2011, 18:19
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hermy667

Registriert seit: 31. Aug 2011
3 Beiträge
 
#8

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

  Alt 31. Aug 2011, 18:33
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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 31. Aug 2011, 18:34
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;

Geändert von Bjoerk (31. Aug 2011 um 19:10 Uhr) Grund: Alternative
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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