AGB  ·  Datenschutz  ·  Impressum  







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

Fehler in Delphi mit For-Schleife

Ein Thema von s.h.a.r.k · begonnen am 20. Apr 2006 · letzter Beitrag vom 20. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 14:57
Hallo,

ich habe da einen Fehler in Delphi und weiß nicht einmal wieso! Schaut euch mal das Bild im Anhang an. Dort habe ich eine Prozedur gepostet, die Einträge in eine ListView schreibt. Laut dem Code würde das ganze ja auch funktioniert, nur jetzt stellt Delphi was "perverses" mit der For-Schleife an, was ich nicht wirklich nachvollziehen kann.

Laut For-Schleife sollte i bei 0 beginnen und bei 5 aufhören (=Länge des Array minus 1) - Nur beginnt die ganz for-Schleife bei 6 bin ich zu blöd, hab ich einen Fehler drin oder macht das nur mein PC so?

PS: Ich hatte das Problem schon einmal, das war aber damals bei Delphi 5. Konnte es damals nur lösen, in dem ich aus der For-Schleife eine While-Schleife machte, was ich aber nicht will. Das muss doch auch anders gehen!

mfg
shark
Miniaturansicht angehängter Grafiken
fehler_947.jpg  
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:05
Das hatten wir schon ein paarmal, das ist Optimierung, die der Compiler automatisch macht.
Es geht einfach schneller runterzuzählen, als rauf.
Benjamin
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:09
Hallo Armin,

Benjamin hat es ja schon kurz beschrieben. Die ausführliche Erklärung findest Du u.a. hier.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:11
Nun ja, die Optimierung ist ja eine Sache, aber die wuerde dann trotzdem nur von 5 auf 0 runterzaehlen, und nicht von 6 abwaerts

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:12
ich denke, dass das ganze wohl nichts mit der
Optimierung zu tun haben sollte.
Wenn der Compiler schon optimiert, dann kann es aber nicht sein
das die Laufvariable einen Wert annimmt der nicht sein darf.

In diesem Fall 6; i kann bzw. sollte doch nur einen Wert von 0 bis max 5 haben.
Tritt Dein Problem auch dann auf wenn Du z.B.
die Prozedure so anpasst, dass Du eine Const max definierst
und das Array NavItems : array[0..max] of array[0..1] of string ...
so definierst.

Die for-Schleife kann dann auch von 0 bis max laufen.
Wird dann immernoch falsch "optimiert"?

Mag es sein, dass length nicht mit dem 2 dimensionalem Array zurechtkommt.

Aus der Hilfe: length - Returns the number of characters in a string or elements in an array.
Und Dein Array hat 6 * 2 Elemente.

Grüße
Klaus


[edit] Text ergänzt [/edit]
Klaus
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:14
Rückwärtszählen ist zwar grundsätzlich eine legitime Optimierungsmöglichkeit, aber hier scheint Delphi nicht nur übers Ziel hinauszuschiessen, sondern auch völig durcheinander zu kommen, oder ist das ein verspäteter Aprilscherz . Und wenn ja, von wem?

Um es genau zu sagen: Delphi optimiert hier den Code kaputt! Wenn s.h.a.r.k hier den verbindlichen Ablaufplan eines Hausbaus in eine Listview schreiben würde (Erst Keller, dann Boden, Wände, 1.Stock ... und zum Schluss das Dach), dann würde Delphi daraus eine ziemlich schwer zu realisierende Arbeitsabfolge generieren; Wer kann schon beim Häuslebau mit dem Dach anfangen...?

Für mich eindeutig ein Fall für Borland bzw. den Delphi-Bug-Report hier im Forum.

PS: D6E funktioniert (natürlich)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:20
Es sind 6 Elemente, 6 mal Dekrementieren führt zum Wert 0, und den Test auf 0 kann man mit einem Assemblerbefehl durchführen.

//Edit: wenn die Laufvariable noch an anderen Stellen benutzt wird, findet keine Optimierung statt.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#8

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:21
Zitat von alcaeus:
Nun ja, die Optimierung ist ja eine Sache, aber die wuerde dann trotzdem nur von 5 auf 0 runterzaehlen, und nicht von 6 abwaerts
afair laeufts intern so ab:

schleifenanfang:
i := 6
//inhalt der schleife
dec(i)
wenn i <> 0 gehe zu schleifenanfang

oder anders ausgedrueckt:
Code:
mov eax, $000000006 //unser i
//schleifenanfang:
inc ebx //ich hatte ein einfaches inc(r) drinnen
dec eax
jnz -$04 //zurueck zum schleifenanfang springen
Folgendermassen muss er bei 6 anfangen und zaehlt bis 1 runter. wenn er bei 0 ankommt springt er raus.
Was das problem ist ist, dass er nicht merkt, dass die Zaehlvariable verwendet wird, denn normalerweise duerfte dann diese Optimierungsmoeglichkeit nicht mehr greifen.

[Add]
Als Problemloesung duerfte dann ein Ausschalten der Optimierung fuer diese Methode reichen, zumindest theoretisch.
[/Add]



greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:42
Du gehst von der falschen Voraussetzung aus das die Tooltips immer korrekt sind.
Das ist insbesondere bei einem Programm mit aktivierter Optimierung nicht der Fall.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:48
Tja, der Compiler ist doch etwas schlauer.
Ich kann zwar keinen Funken Assembler, aber zur Analyse dieses Codes hat es gerade noch gereicht (sofern es überhaupt stimmt ):
Delphi-Quellcode:
var
  i: Integer;
const
  bla: Array[0..5] of string = ('a', 'c', 'e', 'blubb', 'blubber', 'bubbsten');
begin
  for i := 0 to 5 do
    Writeln(bla[i]);
  Readln;
end.
Auch hier beginnt i mit 6. Der Witz ist aber, dass i für den Arrayzugriff überhaupt nicht benutzt wird. Vor Schleifenbeginn wird @bla in EBX gespeichert und mit jedem Durchgang um 4 erhöht, der Compiler kann also immer noch optimieren, wie JasonDX es erklärt hat. Gleiches wird wohl bei shark passiert sein, da dort ebenfalls nur auf ein Array zugegriffen wird.

So etwas kommt eben davon, wenn man auf die Idee kommt, mit Optimierungen zu debuggen .
Sebastian
Moderator in der EE
  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 09:39 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