AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi For-To-Do-Schleife beginnt nicht mit Startwert
Thema durchsuchen
Ansicht
Themen-Optionen

For-To-Do-Schleife beginnt nicht mit Startwert

Ein Thema von DevidEspenschied · begonnen am 29. Okt 2014 · letzter Beitrag vom 30. Okt 2014
Antwort Antwort
Seite 1 von 2  1 2      
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
441 Beiträge
 
Delphi 12 Athens
 
#1

For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:10
Delphi-Version: XE
Ich habe im Programm eine einfache For-To-Do-Schleife, und verwende als Bis-Zähler eine Byte-Variable:

Delphi-Quellcode:
var i, MaxZahl : Byte;
begin
  MaxZahl:=20;
  for i:=1 to MaxZahl do
  begin
    {}
  end;
end;
Nun habe ich das Phänomen, dass bereits der erste Durchlauf für die Schleife den Wert 20 in der Zählervariable i liefert, anstatt 1. Woran kann das liegen?
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:15
Nun habe ich das Phänomen, dass bereits der erste Durchlauf für die Schleife den Wert 20 in der Zählervariable i liefert, anstatt 1.
Wie stellst du das denn fest?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
441 Beiträge
 
Delphi 12 Athens
 
#3

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:18
Na indem ich bei der ersten Zeile zwischen begin-end einen Breakpoint setzen und mir im Debugger den Wert anschaue.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:18
Die Optimierung lässt die Schleife falsch herum laufen, weil das Vergleichen mit 0 (die Abbruchbedingung der Schleife) etwas schneller ist als mit 20.
Das ist so als würdest du eine For-Downto-Do Schleife bauen.
siehe: http://www.delphi-treff.de/object-pascal/schleifen/
Delphi programming
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
441 Beiträge
 
Delphi 12 Athens
 
#5

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:20
Ich habe nun alles auf Repeat-Until geändert und die 20 als Abbruchbedingung genommen. Funktioniert.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#6

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:33
War denn das Ergebnis nach Durchlauf der For-Schleife unerwartet?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:48
Na indem ich bei der ersten Zeile zwischen begin-end einen Breakpoint setzen und mir im Debugger den Wert anschaue.
Das ist dein "Problem" in Anführungszeichen

Du nutzt i nicht in der Schleife, also ist es für den weiteren Programmablauf egal wie der Wert von i ist. Und weil es egal ist, sagt sich der Compiler, dass es für ihn optimaler ist mit dem höheren Wert zu beginnen und runter zu zählen.

Wie gesagt, diesen Effekt hast du nur, weil der Wert von i nicht benötigt wird. Es ist also egal ob For rauf oder runter zählt.

Anders sieht es aber aus wenn du den i-Wert benötigst. Dann wird so gezählt wie es soll. Du kannst es testen:
Delphi-Quellcode:
var i, MaxZahl : Byte;
begin
  MaxZahl:=20;
  for i:=1 to MaxZahl do
  begin
    ShowMessage(IntToStr(i));
  end;
end;
Lass es laufen. Du wirst sehen, es beginnt bei 1.

Also, dein Phänomen tritt nur dann auf wenn es egal ist. Ist es egal, macht der Compiler das was für ihn optimaler ist. Ist es nicht egal, wird es so gemacht wie du es willst.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#8

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 14:49
Weshalb ich fragte, ob das Ergebnis nach der Schlafe denn wie erwartet ist...

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 15:19
Weshalb ich fragte, ob das Ergebnis nach der Schlafe denn wie erwartet ist...
NEIN.

"Nach" der Schleife ist i immer "ungültig".


Intern kann der Compiler das i anders laufen lassen, je nach Code-Optimierung, aber bei "Verwendung" ist i immer richtig (wird intern wieder umgerechnet)
Der Debugger zeigt nur manchmal was Falsches an, vorallem wenn man i innerhalb der Schleife garnicht verwendet.



Zitat:
Delphi-Quellcode:
MaxZahl:=20;
for i:=1 to MaxZahl do
Ach ja, Delphi cached den Endwert sowieso immer, weswegen man dort keine Variable benötigt.
Drum knallt es gern, wenn man Items aus Listen löscht und dabei die Schleife vorwärts durchläuft.
$2B or not $2B

Geändert von himitsu (29. Okt 2014 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#10

AW: For-To-Do-Schleife beginnt nicht mit Startwert

  Alt 29. Okt 2014, 16:40
Hat jemand nach dem i gefragt? oO

Das was die Schleife bezwecken sollte, wurde erreicht, ja oder nein? Das war die Frage an den TE. Falls nein hätten wir es ja mit einem Bug zu tun.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz