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 2 von 2     12   
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 14:53
Zitat von Robert Marquardt:
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.
Ich hab grad nochmal a bissl im asm-durcheinander gewuelt, und siehe da: Delphi interessiert sich nicht fuer den Inhalt von i. Die schleife koennte somit auch von 932745 bis 932739 laufen, und es wuerde nichts aendern. Ein Array hat naemlich die Angewohnheit, schoen seine Werte der Reihe nach im Speicher zu behalten. Also waers ziemlich dumm, jedesmal nach der Adresse des arrays zu fragen, um an das aktuelle Element zu gelangen. Stattdessen wird die Startadresse des Arrays genommen, bzw. das erste verwendete Element, und immer nur die Groesse des Elementes zum Zeiger dazugezaehlt. Damit zeige ich mit nur einer Addition immer aufs aktuelle Element, welche auch schoen nach der Reihe abgearbeitet werden, naemlich vom ersten bis zum letzten, und nicht umgekehrt. Wer schon mal in C mit Pointern gespielt hat, weiss was ich meine.
Es ist dann ein bisschen verwirrend, da ich im Code auf das Arrayelement mit einem Index zugreife, auf dem eigentlich nur Bockmist steht, aber es trotzdem funktioniert. Ergo: Sowohl die Tooltips stimmen, als auch die Compileroptimierung und die Reihenfolge des Zugriffs auf die Arraywerte, und der Hausbau wuerde somit immernoch beim Keller anfangen

greetz
Mike

[Edit] Ich werd zu langsam, und meine Affaere mit dem Roten Kasten geht auch in die Brueche
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:10
Gückgück: http://www.delphipraxis.net/internal...+r%FCckw%E4rts
Insbesondere die Beiträge von mir und Hagen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:33
@s.h.a.r.k und Alle mit BDS2006: Funktioniert das denn oder nicht? Das ist doch das Einzige, was zählt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:36
Ich suche gerade nach einem einfachen Beispiel, einfach deshalb damit der ASM Code im CPU-Fenster übersichtlich bleibt. Leider bisher ohne Erfolg:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  IntArray: Array of Integer;
begin
  SetLength(IntArray, 10);
  for i := 0 to 9 do
    IntArray[i] := i;
end;
Wie müsste eine Schleife aussehen, die optimiert wird und somit rückwärtsläuft? Aber sie muss möglichst einfach sein. So bald man ShowMessage oder gar IntToStr aufruft, geht es im CPU-Fenster wild durch alle möglichen calls durch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:49
Bei mir hat das gereicht:
Delphi-Quellcode:
var
  ar: array[0..5] of integer = (0, 1, 2, 3, 4, 5);

//...
var
  i, r: integer;
begin
 r := 0;
  for i := 0 to 5 do
  begin
    inc(r, ar[i]);
  end;
  ShowMessage(IntToStr(r)); //Wird benoetigt, damit ueberhaupt was mit r gemacht wird (ansonsten wird das inc von der Optimierung weggeschnibbelt)
end;
i wird auf 6 initialisiert und bis 0 runtergezaehlt, in r steht nach der Schleife 15 drinnen. Es funktioniert also, sowohl D7, als auch DS06...

Zitat von Luckie:
Aber sie muss möglichst einfach sein. So bald man ShowMessage oder gar IntToStr aufruft, geht es im CPU-Fenster wild durch alle möglichen calls durch.
Die Schleife geht vom Laden der Werte (bei mir in eax (array) und edx (i)) bis zum jnz Steht (bei mir zumindest) sogar noch schoen in fett drueber, was gerade gemacht wird

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#16

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 15:50
warum nutzt du length?

funktioniert folgendes nicht?
for i:=low(arr) to high(arr) do
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 16:16
Zitat von generic:
warum nutzt du length?

funktioniert folgendes nicht?
for i:=low(arr) to high(arr) do
Das macht es in diesem Fall nur noch schlimmer; weil die Optimierung dann evtl. zuschlaegt. Wenn du eine Array-Grenze kennst (z.B. weil du weisst dass das Array bei 0 losgeht), dann kannst du dir solche Aufrufe sparen, das kostet ja nur CPU-Zeit. Und wie gesagt, ich bin mir nicht sicher ob die Optimierung da noch losgeht

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

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 18:45
Zitat von alcaeus:
Das macht es in diesem Fall nur noch schlimmer; weil die Optimierung dann evtl. zuschlaegt.
Gerade das soll sie ja auch bei mir zu Demonstrationszwecken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 20:50
Ich bekomm echt die Krise... Ihr sagt doch, dass die Compiler-Optimierung bei mir zugeschlagen hat und da was verdreht hat. Wird diese Optimierung jedes mal bei mir angewandt oder kommt das jedes mal aufs neue drauf an.

Mir scheint, dass der Compiler da lustig ist und des macht wie er will... Einmal zählt er von oben nach unten, dann mal wieder so wie ich es gedacht habe, von 0 bis 5, dann mal wieder anders herum... Wieso? Nachdem ich jetzt meinen PC neu gestartet habe klappt es immer mit der for-Schleife. Aber wieso denn? Wenn dann muss es doch immer das selbe Phenomän sein oder?

mfg
shark
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

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

Re: Fehler in Delphi mit For-Schleife

  Alt 20. Apr 2006, 20:58
Sagen wirs so: Die Compileroptimierung ist so ausgelegt, dass sie keinen Einfluss auf die Ausgabe des Programms hat. Und soweit ich das beobachten konnte passt das auch.
Was das in diesem Thread (und dutzenden anderen) besprochene Phaenomen betrifft ist die Verwirrung die gestiftet wird, wenn optimierter Code debuggt wird. Der sieht naemlich ploetzlich etwas anders aus
Er funktioniert auch etwas anders, das Ergebnis bleibt aber das selbe. Sollte es zumindest. Um rauszufinden, wo der Fehler jetzt liegt (an der Optimierung oder nicht) hilft es, einfach einmal die Schleife so zu probieren, und einmal mit ausgeschalteter Optimierung. {$O+/-} muesste AFAIR die denentsprechende Compiler-Direktive sein.
Wenn der Fehler tatsaechlich dort liegt (und es also ein reproduzierbarer Bug ist) kannst du den dann hier in der DP oder in der QualityCentral posten.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:44 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