Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - For Schleifen mit variabler Schrittweite


Jacdelad - Fr 02.06.06 16:37
Titel: For Schleifen mit variabler Schrittweite
Hallo,

nur ne kurze Frage:
Kann ich in einer For-Schleife auch eine andere Schrittweite außer nur 1 bzw. -1 definieren oder muss ich dazu immer eine While- oder Repeat-Schleife nehmen?

Jac


Grendel - Fr 02.06.06 16:40
Titel: Re: For Schleifen mit variabler Schrittweite
user profile iconJacdelad hat folgendes geschrieben:
[...] oder muss ich dazu immer eine While- oder Repeat-Schleife nehmen?

Jepp, genau das.

Bis neulich ...


fidionael - Fr 02.06.06 16:42

Ich bin mir absolut sicher, dass es eine Möglichkeit gibt die Laufvariable auch in n-Schritten erhöhen zu lassen, aber auf die Schnelle hab ich jetzt nicht gefunden wie... Ich melde mich wenn ich's herausgefunden habe ;)


Jacdelad - Fr 02.06.06 16:47

Hm, an einer While-Schleife gehe ich nicht ein, also macht euch keine allzu großen Mühen!

Schönes Wochenende,
Jac


Lannes - Fr 02.06.06 17:02

Hallo,

z.B. in 10er-Schritten so:

Delphi-Quelltext
1:
2:
3:
  for z := 0 to 1000 do
    if z mod 10 = 0 then
      Memo1.Lines.add(IntToStr(z));


LLCoolDave - Fr 02.06.06 19:13

Lannes: Das ist ja wie mit Spatzen auf Kanonen zu schießen. Wenn du in einer Fabrik erst 1000 Produkte zusammenbaust, um am Ende festzustellen, dass du nur jedes 10. davon eigentlich auch haben willst, kriegst du wohl mit Sicherheit erstmal eins vom Chef auf den Deckel und du kannst dir nen neuen Job suchen. Das funktioniert so zwar, ist aber vergleichsweiße langsam, durch das langsame mod und die ganzen ungenutzten Schleifendurchläufe. Am sinnvollsten ist für solche Fälle einfach der Griff zur while Schleife, wie schon gesagt wurde.


oldmax - Fr 02.06.06 19:21

Hi

Versuchs mall mit Step

also For i :=0 to n Step 2;//z.B. kann auch -2 oder 3 oder irgendwas sein...

So ging's jedenfalls früher..

Gruß oldmax


alzaimar - Fr 02.06.06 19:39

'Step' in Pascal? Ich kenn das nur von BASIC.

Lange Rede, kurzer Sinn: Mit For-Schleifen kann man nur in einer-Schritten laufen.


mkinzler - Fr 02.06.06 19:45

Es gabe noch die Möglichkeit die Laufvariable der For-Schleife und die "Nutz"-Variable zu trennen.
z.b. Eine Schleife von 0 bis 10 in 1/10-Schritte:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  i: Integer;
  x: Real;
begin
...
  for i := 0 to 100 do 
  begin
     x := i/10;
  end;
...
end;


oldmax - Fr 02.06.06 19:53

Sorry, mein Fehler.....
....Step ....
geht bei Delphi nich.... schade, hab's aber auch noch nie gebraucht.

Gruß oldmax (der wirklich schon alt wird....)


F34r0fTh3D4rk - Fr 02.06.06 20:02

bei c++ geht das glaube ich in for schleifen, da muss man das increment ohnehin angeben


Jacdelad - Sa 03.06.06 20:02

Naja, ich denke das einfachste ist die Anzahl der Steps zu errechnen und das ganze entsprechend umzurechnen; also bei 3er-Steps mal 3 und so weiter. Danke für die Mithilfe!

Jac


alzaimar - Sa 03.06.06 20:06

Neiiiin!

Delphi-Quelltext
1:
2:
3:
4:
5:
i := 0;
While i < Ende Do Begin
  ...
  i := i + MyStep
End;

Das ist genau das Äquivalente zu einem 'For i:=0 To Ende Step MyStep'


nullplan001 - Sa 03.06.06 21:19

Oder (nur zur Ergänzung) die Kurzschreibeweise:

Delphi-Quelltext
1:
2:
3:
4:
while i < end do begin
  {...}
  inc(i,Step);
end;

Das hat noch den Vorteil, dass dem Compiler ein Optimierungsschritt erspart wird. Aber das nur am Rande. Und nebenbei würde der Optimierungsschritt je nach Takt der DMA-Einheit wenige Milisekunden dauern. Aber es spart massig Tipparbeit bei langen Variablennamen (statt ewiglangername := ewiglangername + ... nur noch inc(ewiglangername,...))
Tschö,
nullplan


fidionael - Mo 19.06.06 23:53

Dies ist zwar ein altes Thema, doch ich hatte ja versprochen mich zu melden wenn ich mich daran erinnere, wie das ging. Ich habe allerdings mit Pointern gearbeitet und eine schöne Lösung ist es definitiv nicht, aber sie funktioniert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
const step=3;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 15 do begin
    inc(PInteger(@i)^,step-1);
    ShowMessage(IntToStr(i));
  end;
end;

Man ist hier jedoch selbst dafür verantwortlich, dass es nicht zu einer Endlosschleife kommt. Ich rate auch zum Gebrauch der While-Schleife, aber der Vollständigkeit halber :)

Edit1
Wo wir grad bei Vollständigkeit sind, sollte ich vielleicht noch anmerken, dass es natürlich auch via Assembler geht; das Problem bleibt aber das oben angegebene:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var i,step: Integer;
begin
  step:=3;

  for i:=1 to 15 do begin
    asm
      mov ecx,step
      dec ecx
      add i,ecx
    end;
    ShowMessage(IntToStr(i));
  end;
end;


aim65 - Di 20.06.06 00:18

Außerdem kann man bei While auch mit Floating-Point Zahlen arbeiten - z.B. für Schleifen mit logarithmischen Schrittweiten. Inc & Dec geht dann natürlich nicht.