![]() |
Array-Problem
Guten Morgen,
ich möchte ein Programm schreiben, das durch Eingabe einer Zahl (Integer-Zahl) alle Teiler errechnet, die keinen Rest haben und in eine ListBox schreibt. So sieht mein Quelltext aus:
Delphi-Quellcode:
Wenn ich nun eine Zahl eingebe, und die Teiler wissen möchte, bekomme ich eine Warnung mit folgendem Inhalt:
procedure TForm1.Button_PruefenClick(Sender: TObject);
var Zahl, ErrorCode, i: Integer; Teiler: Array of Integer; begin Val(Edit_Zahl.Text, Zahl, ErrorCode); if (ErrorCode = 0) and (Zahl >= 2) then begin for i := 1 to Zahl -1 do begin Teiler[i+1] := Zahl mod i; //Zeile1 if Teiler[1] = 0 then ListBox_Teiler.Items.Add(IntToStr(i)) //Zeile2 end; end end; "Acces Violation at address 0045B8C5 in module 'Vollkommen.exe' (Mein Projektname). Write of address 00000008." Es muss an dem Array liegen, denn ohne die Zeile1 und 2 (gekennzeichnit im Quelltext) kommt die Meldung nicht. Ich bitte um schnelle Hilfe und danke schonmal im Vorraus Mysterio08 |
Re: Array-Problem
Für ein dynamisches Array musst Du zuerst mit SetLength Speicher reservieren.
|
Re: Array-Problem
Also ich habe die Schleife jetzt noch um eine Zeile ergänzt:
Delphi-Quellcode:
Jetzt klappt es wunderbar.
for i := 1 to Zahl - 1 do
begin SetLength(Teiler, i+1); Teiler[i] := Zahl mod i; if Teiler[i] = 0 then ListBox_Teiler.Items.Add(IntToStr(i)); end; Danke! |
Re: Array-Problem
Effizienter ist es allerdings, SetLength einmalig vor der Schleife aufzurufen, die Anzahl der Elemente ist ja bekannt.
|
Re: Array-Problem
.. außerdem genügt (wg. des Kommutativgesetzes??!) die Suche bis SQRT(Zahl)....
|
Re: Array-Problem
Zitat:
Delphi-Quellcode:
Nur in der Hoffnung, dass die 9999 auch nicht überschritten werden.
var Teiler: Array[1..9999] of Integer
Zitat:
|
Re: Array-Problem
Wenn Du eine for-Schleife verwendest, muss die Anzahl ja feststehen.
Delphi-Quellcode:
SetLength(Teiler, Zahl - 1); //müsste doch stimmen
for i := 1 to Zahl - 1 do begin Teiler[i - 1] := Zahl mod i; if Teiler[i - 1] = 0 then ListBox_Teiler.Items.Add(IntToStr(i)); end; |
Re: Array-Problem
Zitat:
sqrt(12) -> 3.46 1 * 12 = 12 (Teiler 1 und 12) 2 * 6 = 12 (Teiler 2 und 6) 3 * 4 = 12 (Teiler 3 und 4) alle Teiler gefunden. Grüße Klaus |
Re: Array-Problem
Wow, das war mir so noch nie bewusst, dass man sich das Verfahren so abkürzen kann :shock:
Für die Zahl: 25.000.000 braucht mein Rechner für die For-Schleife ungefähr 32 sec. Wenn man aber nur bis zu 5000 durchlaufen lässt, was ja die Wurzel aus der genannten zahl ist, dauert der Vorgang satte 0 ms :-D Edit: Das Ergebnis ist natürlich das gleiche... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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-2025 by Thomas Breitkreuz