Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - for-schleife mit vergrößerter schrittweite


nepleurepas - Mo 18.06.07 22:04
Titel: for-schleife mit vergrößerter schrittweite
Hallo,
wie kann ich erreichen, dass die laufvariable meiner for-schleife sich pro durchlauf um 3 erhöht?
habs mal mit i:= i+2 versucht, ging nicht.

Hoffe ihr könnt mir helfen.

danke, stefan


Agawain - Mo 18.06.07 22:07

Hi

was genau willst Du denn erreichen?, vielleicht gibts ne andere Lösung.

Gruß

Aga


nepleurepas - Mo 18.06.07 22:09

user profile iconAgawain hat folgendes geschrieben:
Hi

was genau willst Du denn erreichen?, vielleicht gibts ne andere Lösung.

Gruß

Aga


es geht um sodoku. ne andere möglichkeit wäre natürlich mit einer stinknormalen while do schleife zu arbeiten, und von hand zu erhöhen. Dies wollte ich aber zwecks übersichtlichkeit im quelltext vermeiden.


Marc. - Mo 18.06.07 22:12

Um nur jeden 10ten Schleifendurchlauf zu verwenden, könntest natürlich auch jedesmal prüfen, ob ob deine Laufvariable MOD 10 = 0 ergibt. :P

Na, das ist Unsinn. Vllt. hat ja noch jmd. anders eine Lösung parat.

Ansonsten ist sowas meines Erachtens nur in C/C++ möglich. ;)


nepleurepas - Mo 18.06.07 22:18

user profile iconMarc. hat folgendes geschrieben:
Um nur jeden 10ten Schleifendurchlauf zu verwenden, könntest natürlich auch jedesmal prüfen, ob ob deine Laufvariable MOD 10 = 0 ergibt. :P

Na, das ist Unsinn. Vllt. hat ja noch jmd. anders eine Lösung parat.

Ansonsten ist sowas meines Erachtens nur in C/C++ möglich. ;)


und was für ein unsinn!!;-) dann muss wohl while do rann :-(

trotzdem thx


Gausi - Mo 18.06.07 22:19

Soetwas

Delphi-Quelltext
1:
2:
3:
4:
// fehlerhafter Code
for i := 0 to Ende do
  machwas mit i
  i := i+2;
könnte man so machen:

Delphi-Quelltext
1:
2:
for i := 0 to Ende DIV 3 do
  machwas mit 3*i


Ansonsten: While- oder Repeat-Schleifen


oldmax - Di 19.06.07 06:35

Hi
Nun mal ganz einfach: eine Schleifenvariable innerhalb einer Schleife durch irgendwelche Rechenoperationen beeinflussen ist nicht grad toller Programmierstil.
Nehmt für sowas eine separate Variable, setzt diese vor der Schleife auf den gewünschten Anfangswert und dann, wenn um x erhöt werden soll, diese tolle Anweisung

Delphi-Quelltext
1:
Zaehlvar:=Zaehlvar+x;                    


Ok, ansonsten übt euch mit While .. do.. Schleifen oder der hübschen Repeat ... until
Alles andere ist Murks.
Gruß oldmax


ene - Di 19.06.07 07:09

user profile iconMarc. hat folgendes geschrieben:
Ansonsten ist sowas meines Erachtens nur in C/C++ möglich. ;)


Oder auch anderen Sprachen ;)

For i = 0 To 200 Step 5...das vermisse ich am meisten :(


oldmax - Di 19.06.07 09:33

Hi
Zitat:
For i = 0 To 200 Step 5...das vermisse ich am meisten

Auch wenn ich sowas bisher nicht gebraucht hab, aber läßt sich das nicht auch mit

Delphi-Quelltext
1:
For i:=1 to 40 do y:=(i-1)*5;                    

lösen ?
Gruß oldmax


elundril - Di 19.06.07 09:48

:gruebel: seltsam! bei mir sagt mein delphi immer das ich auf die Laufvariable in der Schleife selbst keinen zugriff haben darf.

an was könnte das liegen?

lg elundril


Stefan.Buchholtz - Di 19.06.07 09:59

Der Wert der Laufvariable in der Schleife ist unveränderlich. Du musst eine zusätzliche Variable deklarieren und selbst mit der gewünschten Schrittweite hochzählen.

Stefan


ene - Di 19.06.07 10:12

Vom Prinzip würde das gehen, aber das direkte Step fehlt mir halt und dann wirds immer eine While...Wend Schleife. Denn im 3D hat man schon genug Laufvariablen ;)


Klabautermann - Di 19.06.07 10:56

Hi,
user profile iconStefan.Buchholtz hat folgendes geschrieben:
Der Wert der Laufvariable in der Schleife ist unveränderlich. Du musst eine zusätzliche Variable deklarieren und selbst mit der gewünschten Schrittweite hochzählen.

wer wird denn so absolutistisch sein.

Sagen wir lieber: Der Wert der Laufvariable in der Schleife ist auf direkten Weg unveränderlich.

Pascal erlaubt es nicht die Zählvariable in der Schleife zu verändern was wohl auf seine Herkunft als Lehrsprache zurück zu führen ist. Das heisst aber nicht das man es nicht tun kann wenn man genug "Schmutzige Tricks" anwendet. Auch wenn die Angabe eine Schrittweite sehr praktisch währe geht es wie oben beschrieben auf mit ein paar Mathematischen Kniffen.

Der Vollständigkeit halber hier einmal der Weg wie man die Zählvariable manipulieren kann aber das ist absoluter Programmier Schmutz und sollte nicht verwendet werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
      i : integer;
begin
   for i := 1 to 100 do begin
      LongInt(Addr(i)^) := i + 2;
   end;
end;


Wie schmutzig das ist erkennt man daran, dass die obere Schleife eine Endlosschleife ist, ganz einfach aus dem Grund, dass die 100 nie erreicht wird (es wird ja von i=99 direkt auf i=102 gesprungen) außerdem ist dieses Konstrukt nur eine lumpige Zeile kürzer als die Saubere Version:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
      i : integer;
begin
   i := 1;
   while (i < 101do begin
      inc(i, 3);
   end;
end;


Von daher nimm lieber die while du hast weniger Scherereien damit, du wirst nicht in den ruf kommen ein Pfuscher zu sein und das wird im Gegensatz zu der for Variante auch noch mit Delphi.NET funktionieren.

Gruß
Klabautermann


Stefan.Buchholtz - Di 19.06.07 12:10

user profile iconKlabautermann hat folgendes geschrieben:
Hi,

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
      i : integer;
begin
   for i := 1 to 100 do begin
      LongInt(Addr(i)^) := i + 2;
   end;
end;



Wir haben hier im Büro ein kleines Sparschwein stehen, wo bei besonders schweren Programmierverbrechen der Täter eine kleine Strafe einzahlen muss. Für dieses Konstrukt wären mindestens 5 Euro fällig. :wink:

Stefan


Klabautermann - Di 19.06.07 13:55

Hi,
user profile iconStefan.Buchholtz hat folgendes geschrieben:
Wir haben hier im Büro ein kleines Sparschwein stehen, wo bei besonders schweren Programmierverbrechen der Täter eine kleine Strafe einzahlen muss. Für dieses Konstrukt wären mindestens 5 Euro fällig. :wink:

und das absolut zu recht. Ich wollte nur nicht verschweigen das es technisch möglich ist. Benutzt habe ich ein ähnliches Konstrukt erst ein einziges mal - als Antwortoption auf eine Gewinnspielfrage hier im Forum ;). In ein Programm würde ich so etwas nie schreiben.

Gruß
Klabautermann

PS: und wennuser profile iconnepleurepas versteht warum es funktioniert hat er eine menge über Zeiger gelernt ;).


Raffo - Di 19.06.07 16:13

Da sieht man mal wieder, wie ein "Rückschritt" zur "Moderne" wird, gab es das nicht schon in den 80igern von wegen Basic:

For i:=0 to 10 step 3


Klabautermann - Di 19.06.07 16:38

Hi,
user profile iconRaffo hat folgendes geschrieben:
Da sieht man mal wieder, wie ein "Rückschritt" zur "Moderne" wird, gab es das nicht schon in den 80igern von wegen Basic:

For i:=0 to 10 step 3

Erstens gab es Pascal schon vor den 80ern [http://de.wikipedia.org/wiki/Programmiersprache_Pascal] und zweitens ist es in den meisten Programmiersprachen möglich die Schrittweite Dynamisch an zu passen.
Am besten gefallen mir die C-Artigen for-Schleifen, denn da muss die Abbruch Bedingung nicht mal was mit dem Zähler zu tun haben for (int i = 1; i < 101; i += 3) währe die hier gefragte Schleife for (int i = 1; Spalte[i].Name == 'Meier'; i += 3) währe aber auch eine mögliche for Schleife.

Ich denke kaum ein Delphi-Programmierer hätte was dagegen wenn die For-Schleife einen aquivalent zu deinem Step Operator bekäme, aber solange kommen wir auch ohne aus ;).

Gruß
Klabautermann