AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

For-Schleife von 0 bis 7 fängt bei 8 an

Ein Thema von Flogo · begonnen am 14. Dez 2004 · letzter Beitrag vom 17. Dez 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#1

For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 11:31

Kann das sein? Der Schleifenkopf sieht so aus
Delphi-Quellcode:
    for i := 0 to 7 do
    begin
teste ich i im ersten Schleifendurchlauf mit der Maus (Haltepunkt -> Maus auf i -> Hint) bekomme ich immer [i = 8].
Schreibe ich ein showmessage(IntToStr(i)); in die Schleife funktioniert alles so wie es soll
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 11:36
Wiederrum eine hervorrangende Optimierung des Codes durch den Delphi-Compiler:

siehe http://www.delphi-source.de/insider/...lvariablen.php

Es wird ausgenutzt, dass ein Vergleich gegen Null schneller und weniger speicher braucht. Daher wird in bestimmten Fällen die Variable Rückwärts gezählt.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 11:36
Jup,
das liegt daran der der Compiler den Code so optimiert das er möglichst effektiv arbeitet. Und in der regel ist es einfacher runter zu zählen. Wenn es für das Programm jedoch wichtig ist das "richtig" gezählt wird macht der Compiler keine Optimierung.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#4

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 11:58
Das ist ja schön .
Naja wäre es, wenn es eben wirklich keinen Unterschied machen würde. Aber wenn ich ein Array[0..7] abfragen will nützt mir ein Index 8 eben nichts *grrr*
Gibt es vielleicht irgendeine Möglichkeit das zu umgehen?
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Urmel

Registriert seit: 23. Mai 2004
Ort: Titiwu
28 Beiträge
 
#5

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 12:02
Zitat von Flogo:
...Aber wenn ich ein Array[0..7] abfragen will nützt mir ein Index 8 eben nichts ...
Dann sollte der Compiler das eigentlich von sich aus richtig machen. Wie oben schon gesagt wurde wir ja nur optimiert wenn es auf den Programm ablauf keinen Einfluss hat. Es kann ja sein das der Compiler dein Array "intern" als Array [1..8] behandelt.
Urmel aus dem Eis
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 12:07
Hast Du das mal ohne Optimierung getestet?

Hast Du ein schlüssiges Codebeispiel?
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#7

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 12:07
Hey das ist eine Idee: Ich mache mein Array einfach auch extern zu einem Array[1..8]
Ist zwar irgendwie dämlich dass man so ausweichen muss aber bei mir machts keinen Unterschied.
Danke für die schnelle Hilfe
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 12:29
Zitat von Flogo:
Hey das ist eine Idee: Ich mache mein Array einfach auch extern zu einem Array[1..8]
Ist zwar irgendwie dämlich dass man so ausweichen muss aber bei mir machts keinen Unterschied.
Danke für die schnelle Hilfe
Machs blos nicht. Der Compiler weiss schon was er tut. Wenn du immer einen Eintrag in der For-Schleife indizierst, legt er automatisch einen zusätzlichen Pointer ab, der schon richtig gesetzt wird. Mach dir deswegen keine Sorgen. Der Compiler macht das schon richtig. Sonst wären ja die For-Schleifen unnütz.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 14. Dez 2004, 12:33
Ich glaube, du hast nicht verstanden, was dir versucht wird zu erklären. In ASM baut man schleifen so auf, dass man die Zählvariable in ein Register packt, dieses immer dekrementiert und auf null prüft. Ein Register auf null prüfen ist einfacher und damit performanter als zwei von null verschiedenen Werte mit einander zu vergleichen.

So, wenn der Delphi Kompiler jetzt sieht, dass es unerheblich ist, wie rumm die Schleife läuft, dann optimiert er den Code so, dass oben beschriebener ASM bei rauskommt. Natürlcih hat das zur Folge, dass die Schleife rückwärts läuft. Da es keinen Einfluss auf den Code hat, ist es egal. So bald der Kompiler sieht, dass der Wert der Zählvariablen in der Schleife eine Rolle spilet, ein einfaches ShowMessage reicht da schon, optimiert er nicht mehr.

Warum also willst du an deinem Code was ändern? Wenn du nicht willst, dass dein Programm performant und speicherschonend läuft, dann schlate die Optimierung ab.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: For-Schleife von 0 bis 7 fängt bei 8 an

  Alt 15. Dez 2004, 05:58
Zitat:
Ich glaube, du hast nicht verstanden, was dir versucht wird zu erklären. In ASM baut man schleifen so auf, dass man die Zählvariable in ein Register packt, dieses immer dekrementiert und auf null prüft. Ein Register auf null prüfen ist einfacher und damit performanter als zwei von null verschiedenen Werte mit einander zu vergleichen.
Um das noch genauer auszudrücken:

Bei jeder mathematischen Operation mit Ganzzahlen auf einer Intel CPU wird nicht nur das Resultat berechnet sondern auch Flags gesetzt die bestimmte Besonderheiten des Resultates wiederspiegeln. Wird also ein Register dekrementiert dann wird in den Flags das ZERO Flag automatisch durch diesen DEC Befehl gesetzt wenn das Resultat NULL wurde. D.h. also das solche Operationen implizit bestimmte Abfragen durchführen, und das sofort in diesem Befehl. Danach gibt es bedingte Sprungbefehle die IMMER diese Flags als Grundlage nehmen um zu detektieren ob sie verzweigen sollen. D.h. beim Dekrement eines Register's werden minimal 2 CPU Befehle nötig. Inkrementiert man aber bis zu einer Zahlengrenze so muß die CPU nach dem Inkrement das Resultat = Zählvariable mit dieser Zahl explizit vergleichen und dann erst springen. Das benötigt also 3 Befehle.

Die Optimierung des Compilers benötigt also weniger Befehle um das gleiche Ziel zu erreichen. Die dazu benutzen Befehle sind NICHT schneller als die Befehle des unoptimierten Codes, das ist ein Irrtum.

Willst du aus Debugtechnischen Gründen die Optimierung des Compilers unterdrücken dann schalte die Optimierung einfach aus beim Compilieren.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 09:22 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