![]() |
Seltsamer fehler bei prozedurabarbeitung
Hallo,
habe eine prozedur geschrieben die beim Aufruf allerdings für mich unverständliche Dinge tut. ich setze gleich am anfang i = 0 doch immer wenn ich mit dem debugger durch gehe ist i danach 3 wporan liegt es was übersehe ich?
Delphi-Quellcode:
procedure throw(var playerList : TPlayerCollection; currentplayerID : integer; goals : Tashot);
var points, anz : Array [0..2] of integer; player : TPlayer; Fields : TaFields; i,j,k, anz_alt : integer; begin calcpoints(goals, points, anz); player := playerList.Player[currentplayerID]; Fields := player.Fields; i := 0; for i := 0 to high(points) do begin if points[i]>14 then begin for j:= 0 to high(Fields) do begin if Fields[j].field = points[l] then begin anz_alt := Fields[j].anz; if ((anz_alt + Fields[j].anz) >= 3) then begin Fields[j].anz := 3; if ((anz_alt + Fields[j].anz - 3) > 0) then for k := 0 to playerlist.Count - 1 do if (playerlist.IndexOf(player) <> k) then playerlist.Player[k].Score := playerlist.Player[k].Score +(Fields[j].anz * Fields[j].field); end//if >=3 else Fields[j].anz := anz_alt + Fields[j].anz; end;//if point = field end; //for field end; //point>14 playerlist.Player[currentplayerID].Fields := Fields; if checkWin(Fields) then begin player.haswon := true; end; end; //throw end; |
Re: merkwürdige programmabarbeitung
Bitte gib deinem Thread einen aussagekräftigen Titel. Danke.
|
Re: Seltsamer fehler bei prozedurabarbeitung
Das liegt an der Codeoptimierung. Es ist günstiger für den Prozessor eine Schleife abwärtszählend zu bauen. Und wenn es für das Ergebnis deines Programms irrelevant ist, wierum die Schleife abgearbeiet wird, baut der Compiler deine Schleife um.
|
Re: Seltsamer fehler bei prozedurabarbeitung
Moin Janett,
ich vermute mal das High(points) = 3 ist. Der Compiler optimiert Schleifen nach Möglichkeit so, dass sie rückwärts laufen. Wenn's das nicht ist: Welchen Wert hat i in der Zeile
Delphi-Quellcode:
Es könnte auch sein, dass der Compiler die Zeile
if points[i]>14 then
Delphi-Quellcode:
wegoptimiert, da sie anschliessend als Schleifenzähler genutzt wird.
i:=0;
|
Re: Seltsamer fehler bei prozedurabarbeitung
also points ist ein array [0..2] of integer , deswegen sollte high(points) ja eigentlich 2 und nicht 3 sein und das führt dazu das points[i] (also points[3] immer eine wahnsinnig große zahl ist weil es ja nicht initialisiert wird.
Und das i := 0 hab ich erst reingeschrieben als es nicht ging um es festzulegen aber nach dem schritt ist i = 4446883 also auch nicht 0 ich probier jetzt mal die forschleife abwärts zu ändern. Vielleicht funktionierts ja dann? @Seehase i hat in der Zeile
Delphi-Quellcode:
den wert 3 aber das array geht nur bis zum index 2if points[i]>14 then EDIT: habe die schalfe abwärts gebaut allerdings ist i jetzt -3 im ersten durchlauf -3 obwohl er high(points) als 2 erkennt
Delphi-Quellcode:
bin langsam echt ratlosfor i := high(points) downto 0 do begin if points[i]>14 then begin for j:= 0 to high(Fields) do .... |
Re: Seltsamer fehler bei prozedurabarbeitung
:gruebel:
Noch ein ratloser Ansatz: Wie übergibst du denn points in calcpoints? |
Re: Seltsamer fehler bei prozedurabarbeitung
Das mit dem Schleifenumdrehen kann nicht der Grund sein. Der Compiler dreht zwar den Ablauf der Schleife um in dem Sinne, dass die Zählvariable rückwärts läuft, sorgt aber gleichzeitig durch geschickte Offsets dafür, dass die Schleife logisch weiterhin vorwärts durchlaufen wird.
Das einzige, was sich ändert ist der Inhalt der Schleifenvariable und das ist auch der Grund, warum diese nach der Schleife keinen definierten Wert haben muss (die berühmte Compilerwarning). |
Re: Seltsamer fehler bei prozedurabarbeitung
Ich würde dem Debugger in dieser hinsicht nicht ganz vertrauen. In delphi 7 zumindest war der Wert in
Showmessage(inttostr(i)); immer zuverlässiger als ein überwachter ausdruck oder ctrl-F7. Wir nennen diese Methode "Modern Debugging" :D Das heist du verwendest Dateilogs oder showmessages die über ein define (unseres heist Modern_Debugging) wieder entfernt werden können. Ach ja , Schalt doch bitte nur so zum test die Optimierung mal ab. {$o-} {$o+} |
Re: Seltsamer fehler bei prozedurabarbeitung
Erstens ist die Zuweisung "I := 0;" voellig ueberfluessig, da ja die Schleife die Variable erneut initialisiert.
Die Schleife muss aufwaerts zaehlen, da I innerhalb der Schleife benutzt wird. Die Optimierung greift nicht. Nach Ende der Schleife ist I gemaess Pascalsyntax undefiniert! Die 3 kommt von der Art der Schleifenimplementation. Der Zaehler wird beim letzten Test (I <= 2) nochmals erhoeht. Es ist ja schliesslich egal was hinterher in I steht. Der Debugger zeigt das alles einfach nur brav an. |
Re: Seltsamer fehler bei prozedurabarbeitung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz