![]() |
Möglichkeiten einen Schritt der for-Schleife zu überspringen
Nabend allerseits,
welche möglichkeiten gibt es um in einer for-Schleife, einen durchlauf zu überspringen?
Code:
So in der Art. Welche möglichkeiten gibt es noch?
for i := 0 to 9 do
begin if i <> 4 then begin tuedies := unddas; end; end; Grüsse, Daniel :hi: |
Warum keine While Schleife?
Code:
Wobei das auch nicht viel eleganter ist.
i:=0;
while i<=9 do If i=3 then Inc(i,2) else Inc(i); |
Zitat:
Grüsse, Daniel :hi: PS: ich dachte eher an sowas: if i = 4 then i := 5 oder i +1 |
Tja, aber sonst wüßt ich auch nichts...
Gruß zurück :hi: |
Das Problem ist, in einer for-Schleife kannst du dioe Zählvariable nicht verändern. Deswegen ist wohl eine while-Schleife das beste.
|
Vielleicht was zum warum, der Frage.
In einer LV sind Einträge, welch Wunder... :roll: Nur einem dieser Einträge, kann eine 1 zugewiesen werden, ich muss also alle, bis auf den Markierten auf 0 setzen. Dazu müsste ich eben den Markierten Eintrag überspringen. Je nachdem welchen ich auf 1 setze, alle anderen müssen dann automatisch auf 0 gesetzt werden. Grüsse, Daniel :hi: |
Hallo Daniel,
ich sehe noch nicht, warum sich dies nicht elegant mit einer FOR-Schleife lösen läßt:
Delphi-Quellcode:
Warum nicht so?
For index:= 0 To myListView.Items.Count-1 Do
Begin If myListWiew.Items[Index].Selected Then myListView.Items[Index]._welche_Property_auch_immer:= 1 Else myListView.Items[Index]._welche_Property_auch_immer:= 0; End; |
Moin Zusammen,
oder so:
Delphi-Quellcode:
Damit hätte man auch Multiselect erledigt.
for i := 0 to ListView1.Items.Count-1 do
begin ListView1.Items[i].BeliebigeEigenschaft := ord(ListView1.Items[i].Selected); end; Wenn es definitiv nur ein Eintrag ist, könnte man sich auch eine Form Property einrichten, die jeweils den Index des zuletzt gewählten Eintrages enthält (initial -1). Dann hätte man immer den Index des Eintrages, dass beim Wechsel des Selected Items auf 0 gesetzt werden müsste, und könnte gezielt, via ListView1.Selected.Index, den einen Eintrag ansprechen, bei dem auf 1 gesetzt werden muss. Dieser Index kommt dann in die Property. Das könnte sich, zumindest bei vielen Werten, ausgesprochen positiv auf die Laufzeit auswirken. (im Gegensatz zum Durchlauf durch alle Items) |
Hi,
Zitat:
Das Bsp. von Typercon ist ein klassischer Fall. Variable bleibt Variable. bei 9 tritt der exit-Fall ein. Würde man schreiben : FOR i:= 1 TO 10000 würde die 9 der while schleife ignoriert, das entspräche dann for i := 1 to 9. Das ginge ja noch. Gruß Hansa |
Das meine ich:
Delphi-Quellcode:
Du kannst die Zählvariable innerhalb der for-Schleife nicht verändern! Und das hatte er ja vor, siehe hier:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer; begin for i := 0 to 10 do begin Listbox1.Items.Add(IntToStr(i)); i := i + 2; end end; Zitat:
|
Hi Luckie,
Warum soll das denn nicht gehen ? :roll: Setze ich INNERHALB der Schleife die Zähler-Variable auf einen anderen Wert nimmt er den zugewiesenen als nächsten und macht weiter, als sei nichts geschehen. Wenn innerhalb der Schleife z.B. jeder zweite Wert genommen werden soll, d.h. einer wird jeweils übersprungen, würde ich gennauso vorgehen, nur halt i mod 2 = 0 verwenden (oder = 1). Mit AddItem wird dannn nur jeder zweite Wert mit berücksichtigt. Gruß Hansa |
Zitat:
|
Hi,
tatsächlich, habe es ausprobiert. So soll man es ja normalerweise auch nicht machen. Habe auch eine Stelle im Programm, wo ich das brauche,aber wo ? Und das geht nicht!!! :mrgreen: So ein Mist. In einem kleinen Programm brauch ich das. Na ja, dann eben mit while, ist logischer und sicherer, wenn es geht. Diese Sch... Exit-Sachen. Jetzt bin ich ja zumindest vorgewarnt und behaupte das Gegenteil. Aber die Compiler-Schalter müßte man sich doch noch ansehen. Gruß Hansa P.S.: Bist Du echt in Tennessee? Dann versteh ich die Uhrzeit. :cat: Die Katze kann ja dann Jack Daniels trinken. |
Man muß sich mal den ASM-Code für so eine for-Schleife ankucken. Wenn du da die Zählvarible änderst, wirst du wohl den Inhalt der Register ordentlich durcheinander bringen und deswegen verhindert Delphi die Kompilierung.
Allerdings kenne ich mich mit ASM nicht besonders aus, weswegen ich mich da nicht so festlegen will, ist nur eien Vermutung. In Tennessee bin ich leider nicht, da wäre ich aber gerne, in Memphis eben oder Los Angles am Strand oder so. Und den Jack Daniels trinke ich schon selber, mach dir da mal keine Sorgen. :P |
Möglich wäre es auch so:
Code:
for i := 0 to 9 do
begin if i = 4 then Continue; tuedies := unddas; end; |
Hallo Christian,
Zitat:
@Daniel, so habe ich es bisher gelöst, dennoch Danke. Ich bin nur auf der suche, nach etwas Performance-Technischen möglichkeit, oder wie man sachen leichter und einfacher machen kann, ohne immer das zu benutzen, was sich am leichtesten schreiben lässt. :mrgreen: Zitat:
Also, 0 to 5. Der dritte soll übersprungen werden. i hat gerade 2, ich schreibe in diesem Druchgang i := i +1, der nächste durchgang ist bereits 3, somit hätte ja meine änderung nichts bewirkt. Ich müsste es doch auf i := i +2 setzen. Eigentlich müsste ich i 2 durchläufe vorher +2 setzen, bei 1 schon. Aaarghh, mein Kopf expodiert gleich. Es ist eh schon zu früh. :freak: ODer? Wenn ich mir da so durchdenke, werd ich ständig verwirrt. Hmm... Grüsse, Daniel :hi: |
Hallo Luckie,
Zitat:
Code:
MfG,
[b]procedure[/b] Produce();
[b]var[/b] i: Integer; p: ^Integer; [b]begin[/b] [b]for[/b] i := 0 [b]to[/b] 9 [b]do[/b] [b]if[/b] (i = 4) [b]then begin[/b] ShowMessage(IntToStr(i)); p := @i; p^ := i + 1; ShowMessage(IntToStr(i)); [b]end[/b]; [b]end[/b]; d3g |
Man braucht das gar nicht irgendwie kompliziert über ASM machen.. es reicht schon ganz normal über einen Pointer auf die Zählvariable zuzugreifen:
for i := 0 to x do Integer(Pointer(@i)^) := i + 1; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
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