AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi [gelöst] Wie oft wird diese Schleife durchlaufen?
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] Wie oft wird diese Schleife durchlaufen?

Ein Thema von asq81 · begonnen am 17. Feb 2011 · letzter Beitrag vom 17. Feb 2011
Antwort Antwort
asq81

Registriert seit: 21. Jan 2011
4 Beiträge
 
#1

[gelöst] Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 11:16
Hallo!

ich fühle mich langsam etwas dumm =)
denn ich kann meinen Denkfehler einfach nicht entdecken, in dieser doch recht simpel anmutenden Schleife...
Bitte seht euch dies mal an:

Im folgenden Code wird der Index 'LASDidx' immer wieder mal zu gross. Grösser als der MAx-Index der vom SetLenght(...) kommt, was eigentlich nicht passieren sollte, da der Parameter 'LHelper' im SetLenght-Aufruf doch der Zahl der Durchläufe in der Schleife entsprechen sollte, oder nicht?
(offensichtlich nicht, denn da tritt ja der Fehler auf, ich finde dessen Ursache aber leider einfach nicht)


Delphi-Quellcode:
procedure Raster;
var
  i, k, iX, iY, LStartX, LEndX, LStartY, LEndY: Integer;
  LASD: array of TSDResult;
  LSDValue: Int64;
  LASDidx: Integer;
  LStep: Integer;
  LHelper: Integer;
  LOffX, LOffY: Integer;
begin

  LStep := 64; // oder irgendein anderes 2^n
  LStartX := 0; // anfangs immer 0
  LEndX := 1000; // immer > LStartX
  LStartY := 0; // mit Y wie bei X
  LEndY := 570;

  Repeat
    LASSDidx := 0;

    LHelper := Trunc(((LEndX-LStartX)*(LEndY-LStartY))/Sqr(LStep))+1; // +1 wegen Trunc()
    SetLength(LASD, LHelper);

    iX := LStartX;
    while iX <= LEndX do
    begin
      iY := LStartY;
      while iY <= LEndY do
      begin
        LASD[LASDidx].X := iX;
        LASD[LASDidx].Y := iY;
        Inc(LASDidx);

        if LASDidx >= High(LASD) then
// dieser If Block ist zum debuggen eingefügt
// hier habe ich einen Haltepunkt um zu sehen wann der Index out of Bounds geht
          showmessage(IntToStr(LASDidx)+ ' / ' + IntToStr(High(LASD)));

        iY += LStep;
      end;
      iX += LStep;
    end;

   // folgend wird ein zufälliger LOffX und LOffY gewählt
   // welche innerhalb oder auf den Grenzen (LStart../LEnd..)liegen
   // FMaxWidth und FMaxHeight sind konstante Werte die anfangs immer
   // grösser als LEndX bzw. LEndY sind
 
    LHelper := LOffX - LStep;
    if LHelper >= 0 then LStartX := LHelper else LStartX += 1;

    LHelper := LOffX + LStep;
    if LHelper <= FMaxWidth then LEndX := LHelper else LEndX -= 1;

    LHelper := LOffY - LStep;
    if LHelper >= 0 then LStartY := LHelper else LStartY += 1;

    LHelper := LOffY + LStep;
    if LHelper <= FMaxHeight then LEndY := LHelper else LEndY -= 1;

    // raster enger ziehen
    LStep := LStep div 2;

  until LStep = 0;

end;
Danke für eure Mühe!

lg
asq81

edit: paar Rechtschreib- u. Tippfehler korrigiert
edit2: Danke @WM_CLOSE! ich fand den code auch zu unbunt =) ([ CODE ] zu [ DELPHI ] geändert)

Geändert von asq81 (17. Feb 2011 um 14:15 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 11:24
Funktioniert den das?
iY += LStep; Das ist doch eher c.
Markus Kinzler
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 11:33
Lazarus?
Benutze bitte unbedingt den Delphi-Tag (den mit dem Römerhelm)
Dann sieht der Code übersichtlicher aus
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 11:39
Was ist mit

LASSDidx und
LASDidx ?
Gruß, Jo
  Mit Zitat antworten Zitat
asq81

Registriert seit: 21. Jan 2011
4 Beiträge
 
#5

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 11:45
Funktioniert den das?
iY += LStep; Das ist doch eher c.
Richtig, ich benutze Lazarus da geht es
(hatte zuvor die a := a + b; Schreibweise, aber der Fehler bleibt an selber Stelle)

Was ist mit

LASSDidx und
LASDidx ?
ist nur ein Schreibfehler, ich habe ein paar Codeteile vereinfacht dargestellt, der Übersichtlichkeit halber, muss dabei passiert sein (die weggelassenen Teile sind bei mir im Original auskommentiert, haben also keinen Einfluss)

edit: @jo: wo siehst du den Schreibfehler? Ich glaube ich habe den bereits korrigiert? =)

Geändert von asq81 (17. Feb 2011 um 11:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#6

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 12:09
Ich würde folgendes korrigieren:
LHelper := Trunc(((LEndX-LStartX)*(LEndY-LStartY))/Sqr(LStep))+1; // +1 wegen Trunc() zu
LHelper := ceil((LEndX - LStartX) / LStep) * ceil((LEndY - LStartY) / LStep); Zur Erklärung zu deinem Beispiel: Die X-Schleife wird 16 mal durchlaufen, die Y-Schleife 9 mal. Folglich greifst du auf 144 Elemente zu.
LHelper wird aber anders berechnet: 1000/64 = 15.625, 770/64 = 8.90625. Das Produkt daraus wird aber 139.16..., entsprechend bekommt das Array nur 140 Elemente. Es muss vor dem Multiplizieren gerunden werden.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
asq81

Registriert seit: 21. Jan 2011
4 Beiträge
 
#7

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 12:40

ich benutze jetzt das Äquivalent: (weil Lazarus offenbar kein Ceil() kennt)
Delphi-Quellcode:
LHelper := Trunc(((LEndX-LStartX)/LIterationPixelStep)+1)
         * Trunc(((LEndY-LStartY)/LIterationPixelStep)+1);
(Liefert nun immer exakte Menge an benötigten Elementen)

Super! Danke vielmals!! =)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 13:07

ich benutze jetzt das Äquivalent: (weil Lazarus offenbar kein Ceil() kennt)
Würde mich allerdings stark wundern! Jedenfalls hat FPC function ceil(x: float) : Integer in unit math (genau wie Delphi).
  Mit Zitat antworten Zitat
asq81

Registriert seit: 21. Jan 2011
4 Beiträge
 
#9

AW: Wie oft wird diese Schleife durchlaufen?

  Alt 17. Feb 2011, 14:13
Stimmt, ist in Math mit drin, wusste ich nicht. Danke! =)
  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 05:01 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