Ahoi,
ich habe hier ein Programm mit mehreren Formularen.
In einem dieser Formulare läuft ein Primzahlsieb...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| ... TDynBoolArray=array of Boolean; ... implementation
procedure Sieb(max:integer); var i,k:integer; begin SetLength(feld,max-2); For i:=2 to max do feld[i-2]:=true; For i:=2 to round(sqrt(max)+1) do For k:=i to round(max/i) do feld[i*k]:=false; end;
procedure TForm_Sieb.Button1Click(Sender: TObject); var max,err,i:integer;
begin val(Sieb_ED_max.text,max,err); if err<>0 then ShowMessage('Fehlerhafte Eingabe!') else if max > 1 then begin Listbox1.Clear; Sieb(max); for i:=2 to max do if feld[i-2] then Listbox1.Items.Add(inttostr(i)); end else ShowMessage('Nur Zahlen größer 1 eingeben!'); end;
procedure TForm_Sieb.FormClose(Sender: TObject; var Action: TCloseAction); begin setlength(feld,0); end; |
das ist jetzt eine vereinfachte Version, eig. sollte die Sieb-Prozedur als Funktion in einer anderen Unit laufen und der Return-Array dann kopiert werden, doch da hat man nicht so gut durchgesehen
-> Wenn ich das ausführe sürtzt das Programm immer mit einem InvalidPointer Error ab, egal wo ich das SetLength(Feld,0) setze
(also a) im Form_Sieb.Close, b) direkt nach dem schreiben, c) garnicht -> Dann wird es beim schließen der Mainform automatisch gemacht.)
sieht wer den Fehler?
MfG Pyromane
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt