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
Agawain 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
Marc. 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:
| 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
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
Marc. 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,
Stefan.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 < 101) do 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
Klabautermann 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,
Stefan.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 wenn
nepleurepas 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,
Raffo 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!