for Endlosschleife nicht möglich

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

for Endlosschleife nicht möglich

Beitrag von Epcop »

Ist zwar keine Frage, nur eine Feststellung.

Ich habe gerade festgestellt, dass das hier NICHT funktioniert:

Code: Alles auswählen

 
var
  z, ende: integer;
begin
  ende := 0;
  for z := 0 to ende do begin
   ende := ende + 1;
   ShowMessage(IntTostr(z));
  end;
 


Irgendwie war ich mir sicher, dass ich in einer anderen Sprache so schon endlosschleifen produziert habe.

(ich wollte bei einer bestimmten Bedingung, die Schleife nochmal durchlaufen... Schlechter Programmierstil?! :-D )

Bei z := z - 1; wird ja gleich geschimpft ^^ Zumindest bei for schleifen kann einen bei Lazarus keine Endlosschleife passieren. Gut zu Wissen ;)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: for Endlosschleife nicht möglich

Beitrag von Komoluna »

bei einer for schleife wird der startwert und endwert seperat gespeichert.
deswegen kannst du auch

Code: Alles auswählen

for x:=0 to 3+b do [...]

machen, weil da 3+b vorher gespeichert wird.

Das ist vielleicht in anderen Sprachen anders(hab noch nie drauf geachtet).

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: for Endlosschleife nicht möglich

Beitrag von m.fuchs »

Epcop hat geschrieben:Irgendwie war ich mir sicher, dass ich in einer anderen Sprache so schon endlosschleifen produziert habe.

In PHP ist das möglich:

Code: Alles auswählen

<?php
  $ende = 0;
  for ($i = 0; $i <= $ende; $i++):
    $ende = $ende +1;
    echo $i;
  endfor;
?>

Das liegt daran, dass die Abarbeitung der for-Schleife anders verläuft. Hier wird nämlich nicht eine Variable hochgezählt, sondern nach jedem Durchgang der dritte Term des for-Konstrukts ausgeführt und vor jedem Durchgang geprüft, ob der zweite Term true ergibt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: for Endlosschleife nicht möglich

Beitrag von marcov »

Epcop hat geschrieben:Irgendwie war ich mir sicher, dass ich in einer anderen Sprache so schon endlosschleifen produziert habe.


Andere Sprachen haben oft kein richtiger FOR, FOR ist da oft nur eine Kurzform für eine WHILE Konstruktion. Dass kann man oft daran sehen wenn das end Klausel nicht "gleich" aber "gleich oder kleiner".

Pascal FOR ist ein richtiger FOR. Nur "von" bis "bis".

Komoluna's Bemerkung ist auch sehr wichtig. Das End Klausel wird nur einmal evaluiert, um der Zahl der Iterationen (bis-von+1) fest zu stellen

Mit ein WHILE kann man so Endlosschleifen machen, und wird das End Klausel immer wieder evaluiert. In Pascal ist Modifikation des FOR Schleifevariabels nicht gestattet und das Effekt undefiniert um Optimisationen nicht zu behindern.

(ich wollte bei einer bestimmten Bedingung, die Schleife nochmal durchlaufen... Schlechter Programmierstil?! :-D )


Ja.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: for Endlosschleife nicht möglich

Beitrag von corpsman »

Alles ist möglich man braucht nur eine gering genuge Moral :

Code: Alles auswählen

 
Var
  z, ende: integer;
  pi: ^Integer;
Begin
  ende := 1;
  pi := @z;
  For z := 0 To ende Do Begin
    pi^ := 0;
    ende := ende + 1;
    ShowMessage(IntTostr(ende));
  End
 
 
--
Just try it

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: for Endlosschleife nicht möglich

Beitrag von marcov »

corpsman hat geschrieben:Alles ist möglich man braucht nur eine gering genuge Moral :


Das ist nicht garantiert! Es ist die FOR Schleife zugelassen der Variabel in ein Register zu behalten.

Delphi erlaubt etwas mehr als Klassisch Pascal, und es kann das der Optimierer solche Konstruktionen detektiert und dann nicht optimiert, aber da gibst keine Garantien.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: for Endlosschleife nicht möglich

Beitrag von mschnell »

AFAIK:

In C dürfen im for-Schleifenkopf verwendete Variablen im Schleifen Body beliebig verändert werden und das hat dann die Wirkung, die man erwarten sollte.

In Pascal ist das verboten.

-Michael

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: for Endlosschleife nicht möglich

Beitrag von Komoluna »

Gibt es vielleicht einen Compilerschalter, womit man das erlauben kann?
Manchmal hat das ja doch so seine Vorteile...

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: for Endlosschleife nicht möglich

Beitrag von m.fuchs »

Wenn du so einen Schmutz machen möchtest, nimm doch C.

Was soll denn das für Vorteile haben? Wer die Bedingungen im Schleifenkörper beeinflussen möchte, kann dafür die while...do- oder die repeat...until-Schleife verwenden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: for Endlosschleife nicht möglich

Beitrag von mschnell »

m.fuchs hat geschrieben:Was soll denn das für Vorteile haben?


Man kann völlig Code schreiben, den keiner mehr versteht :twisted:

-Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: for Endlosschleife nicht möglich

Beitrag von m.fuchs »

mschnell hat geschrieben:
m.fuchs hat geschrieben:Was soll denn das für Vorteile haben?

Man kann völlig Code schreiben, den keiner mehr versteht :twisted:

Ich fragte nach Vorteilen. :)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: for Endlosschleife nicht möglich

Beitrag von mse »

Der Vorteil ist die sichere Arbeitsstelle. ;-)

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: for Endlosschleife nicht möglich

Beitrag von marcov »

Komoluna hat geschrieben:Gibt es vielleicht einen Compilerschalter, womit man das erlauben kann?


Nein. Es gibt aber break und continue

Manchmal hat das ja doch so seine Vorteile...


Natürlich, darum gibt auch while und repeat. Es gibt nur keine Zwischenform.

Antworten