Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsamer fehler bei prozedurabarbeitung (https://www.delphipraxis.net/84861-seltsamer-fehler-bei-prozedurabarbeitung.html)

schuetzejanett 22. Jan 2007 22:13


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;

Luckie 22. Jan 2007 22:18

Re: merkwürdige programmabarbeitung
 
Bitte gib deinem Thread einen aussagekräftigen Titel. Danke.

sirius 22. Jan 2007 22:29

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.

Christian Seehase 22. Jan 2007 22:29

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:
if points[i]>14 then
Es könnte auch sein, dass der Compiler die Zeile
Delphi-Quellcode:
i:=0;
wegoptimiert, da sie anschliessend als Schleifenzähler genutzt wird.

schuetzejanett 22. Jan 2007 22:39

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:
 
     if points[i]>14 then
den wert 3 aber das array geht nur bis zum index 2

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:
 
 for i := high(points) downto 0 do
    begin
      if points[i]>14 then
        begin
          for j:= 0 to high(Fields) do
  ....
bin langsam echt ratlos

sirius 22. Jan 2007 22:54

Re: Seltsamer fehler bei prozedurabarbeitung
 
:gruebel:
Noch ein ratloser Ansatz:
Wie übergibst du denn points in calcpoints?

Sidorion 23. Jan 2007 08:31

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).

QuickAndDirty 23. Jan 2007 09:27

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+}

Robert Marquardt 23. Jan 2007 10:02

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.

sirius 23. Jan 2007 10:10

Re: Seltsamer fehler bei prozedurabarbeitung
 
Zitat:

Zitat von Robert Marquardt
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.

Das erklärt aber nicht, warum die Schleifenvariable innerhalb der Schleife auf 3 (oder sogar -3) steht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr.
Seite 1 von 2  1 2      

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