Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Array-Problem (https://www.delphipraxis.net/132569-array-problem.html)

Mysterio08 15. Apr 2009 09:08


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:
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;
Wenn ich nun eine Zahl eingebe, und die Teiler wissen möchte, bekomme ich eine Warnung mit folgendem Inhalt:
"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

DeddyH 15. Apr 2009 09:27

Re: Array-Problem
 
Für ein dynamisches Array musst Du zuerst mit SetLength Speicher reservieren.

Mysterio08 15. Apr 2009 10:38

Re: Array-Problem
 
Also ich habe die Schleife jetzt noch um eine Zeile ergänzt:
Delphi-Quellcode:
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;
Jetzt klappt es wunderbar.
Danke!

DeddyH 15. Apr 2009 10:42

Re: Array-Problem
 
Effizienter ist es allerdings, SetLength einmalig vor der Schleife aufzurufen, die Anzahl der Elemente ist ja bekannt.

Billa 15. Apr 2009 10:52

Re: Array-Problem
 
.. außerdem genügt (wg. des Kommutativgesetzes??!) die Suche bis SQRT(Zahl)....

Mysterio08 15. Apr 2009 11:07

Re: Array-Problem
 
Zitat:

Zitat von DeddyH
Effizienter ist es allerdings, SetLength einmalig vor der Schleife aufzurufen, die Anzahl der Elemente ist ja bekannt.

Nein, die Anzahl der Zahlen, die durch die Anfangszahl teilbar sind, steht noch nicht fest. Ich habe ja bei 10.000 mehr Teiler als bei 6 und ich halte es für Verschwendung, wenn ich schreibe:
Delphi-Quellcode:
var Teiler: Array[1..9999] of Integer
Nur in der Hoffnung, dass die 9999 auch nicht überschritten werden.


Zitat:

Zitat von Billa
.. außerdem genügt (wg. des Kommutativgesetzes??!) die Suche bis SQRT(Zahl)....

Mhm, dazu kann ich nichts sagen, ich dachte mit SQRT zieht man die Quadratwurzel einer Zahl und was hat das Kommutativgesetz damit zu tun?

DeddyH 15. Apr 2009 11:15

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;

Klaus01 15. Apr 2009 11:16

Re: Array-Problem
 
Zitat:

Zitat von Mysterio08
Zitat:

Zitat von Billa
.. außerdem genügt (wg. des Kommutativgesetzes??!) die Suche bis SQRT(Zahl)....

Mhm, dazu kann ich nichts sagen, ich dachte mit SQRT zieht man die Quadratwurzel einer Zahl und was hat das Kommutativgesetz damit zu tun?

.. angenommen Deine Zahl ist 12
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

TonyR 15. Apr 2009 11:44

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 07:38 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