Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zahlenkombinationen generieren (https://www.delphipraxis.net/160350-zahlenkombinationen-generieren.html)

Georg25 12. Mai 2011 14:57

AW: Zahlenkombinationen generieren
 
Code:
procedure TForm_Main.Generator;
var
  stellen, max, i, j, k : Integer;
  pos : Array of Integer;
  s : String;
begin
  stellen := 3;
  max:= 15;
  SetLength(pos, stellen);

   k := StrToInt(FloatToStr(power(stellen,max)));

  for i:= 0 To stellen-1 do
    pos[i]:=1;

  for i:= 1 to k do begin
      s:='';
      Inc(pos[0]);

      for j:=0 To stellen -1 do
        if pos[j]=max+1 then begin
            pos[j]:=1;
            Inc(pos[j+1]);
          end;


      for j:=0 To stellen-1  do
        s:=s+IntToStr(pos[j]);
      Memo_Output.Lines.Add(s);
    end;
end;
Ich hab nun diesen Code benutzt, allerdings spuckt er am Ende immer eine Fehlermeldung aus:
Exception der Klasse "EInvalidPointer", "ungültige Zeigeroperation"

http://www.abload.de/img/errorzumv.png

Ich hab einiges versucht, aber irgendwie komme ich nicht weiter, hat wer noch eine Idee?

mfg

DeddyH 12. Mai 2011 15:01

AW: Zahlenkombinationen generieren
 
Hast Du einmal die Bereichsprüfung aktiviert? Mir kommt diese Stelle nicht ganz koscher vor:
Zitat:

Delphi-Quellcode:
for j:=0 To stellen -1 do
        if pos[j]=max+1 then begin
            pos[j]:=1;
            Inc(pos[j+1]); //was ist, wenn das letzte Array-Element erreicht ist?
          end;


Coffeecoder 12. Mai 2011 15:08

AW: Zahlenkombinationen generieren
 
Hey,

Ich habe das Programm mal laufen gelassen.

Zitat:

Zitat von DeddyH (Beitrag 1100417)
Hast Du einmal die Bereichsprüfung aktiviert? Mir kommt diese Stelle nicht ganz koscher vor:
Zitat:

Delphi-Quellcode:
for j:=0 To stellen -1 do
        if pos[j]=max+1 then begin
            pos[j]:=1;
            Inc(pos[j+1]); //was ist, wenn das letzte Array-Element erreicht ist?
          end;


Da liegt das Problem! Er läuft noch weiter und weiter und weiter.Auch wenn er schon lange das letzte Element erreicht hat, dann kommt es zur Exception der Klasse "EInvalidPointer", "ungültige Zeigeroperation".

Mfg Coffeecoder

DeddyH 12. Mai 2011 15:12

AW: Zahlenkombinationen generieren
 
Genau das meinte ich, man kann schlecht auf einen Nachfolger zugreifen, der gar nicht existiert. Zumindest eine Abfrage, ob j kleiner als High(Pos) ist gehört da noch vorgeschaltet.

Jumpy 12. Mai 2011 15:20

AW: Zahlenkombinationen generieren
 
Man muss nicht unbedingt prüfen, man muss nur Fehlerfrei programmieren:oops:

Da ich das glaub ich ursprünglich verbrochen habe:

for j:=0 To stellen -1 do

muss einfach nur

for j:=0 To stellen -2 do

heißen, da pos[stellen-1] natürlich das letzte Element des Array ist und pos[j+1] daher für j=stellen-1 nie funktionieren kann.


Das nachher alles bei 151515 endet, muss man über die äußere Schleife steuern, kann also sein das bei

k := StrToInt(FloatToStr(power(stellen,max)));

nochwas abgezogen werden muss, oder mit max-1 gerechnet werden muss.

Hab das damals ja ohne Delphi ins Forum getippt.

DeddyH 12. Mai 2011 15:23

AW: Zahlenkombinationen generieren
 
Zitat:

Wer ohne Fehler ist, werfe das erste Schwein.
(oder so ähnlich) ;)

Georg25 12. Mai 2011 15:32

AW: Zahlenkombinationen generieren
 
Code:
procedure TForm_Main.Generator;
var
  stellen, max, i, j, k : Integer;
  pos : Array of Integer;
  s : String;
begin
  stellen := 2;
  max:= 3;
  SetLength(pos, stellen);

  k := StrToInt(FloatToStr(power(max, stellen)));

  for i:= 0 To stellen-1 do
    pos[i]:=1;

  for i:= 1 to k do begin
      s:='';
      Inc(pos[0]);

      for j:=0 To stellen -1 do
        if pos[j]=max+1 then begin
            pos[j]:=1;
            if high(pos) < pos[j+1] then Inc(pos[j+1]);
          end;


      for j:=0 To stellen-1  do
        s:=s+IntToStr(pos[j]);
      Memo_Output.Lines.Add(s);
    end;
end;
Ich hab nun eine Abfrage hinzugefügt, allerdings sind nun alle "doppelzahlen" (22,33) immer 11 :/

DeddyH 12. Mai 2011 15:40

AW: Zahlenkombinationen generieren
 
Delphi-Quellcode:
if j < high(pos) then
  Inc(pos[j+1]);
Für das funktionale Problem fehlt mir im Moment die Zeit, den Code logisch nachzuvollziehen.

Georg25 12. Mai 2011 15:47

AW: Zahlenkombinationen generieren
 
Super, Danke das war schon, nun funktioniert es :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz