AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array-Problem

Ein Thema von Mysterio08 · begonnen am 15. Apr 2009 · letzter Beitrag vom 15. Apr 2009
Antwort Antwort
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#1

Array-Problem

  Alt 15. Apr 2009, 10:08
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: Array-Problem

  Alt 15. Apr 2009, 10:27
Für ein dynamisches Array musst Du zuerst mit SetLength Speicher reservieren.
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
  Mit Zitat antworten Zitat
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#3

Re: Array-Problem

  Alt 15. Apr 2009, 11:38
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!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

Re: Array-Problem

  Alt 15. Apr 2009, 11:42
Effizienter ist es allerdings, SetLength einmalig vor der Schleife aufzurufen, die Anzahl der Elemente ist ja bekannt.
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
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Array-Problem

  Alt 15. Apr 2009, 11:52
.. außerdem genügt (wg. des Kommutativgesetzes??!) die Suche bis SQRT(Zahl)....
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#6

Re: Array-Problem

  Alt 15. Apr 2009, 12:07
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:
var Teiler: Array[1..9999] of Integer Nur in der Hoffnung, dass die 9999 auch nicht überschritten werden.


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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

Re: Array-Problem

  Alt 15. Apr 2009, 12:15
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;
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Array-Problem

  Alt 15. Apr 2009, 12:16
Zitat von Mysterio08:
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Array-Problem

  Alt 15. Apr 2009, 12:44
Wow, das war mir so noch nie bewusst, dass man sich das Verfahren so abkürzen kann

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

Edit: Das Ergebnis ist natürlich das gleiche...
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:42 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