AGB  ·  Datenschutz  ·  Impressum  







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

Seltsamer fehler bei prozedurabarbeitung

Offene Frage von "schuetzejanett"
Ein Thema von schuetzejanett · begonnen am 22. Jan 2007 · letzter Beitrag vom 23. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#1

Seltsamer fehler bei prozedurabarbeitung

  Alt 22. Jan 2007, 23:13
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: merkwürdige programmabarbeitung

  Alt 22. Jan 2007, 23:18
Bitte gib deinem Thread einen aussagekräftigen Titel. Danke.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 22. Jan 2007, 23:29
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 22. Jan 2007, 23:29
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

if points[i]>14 then Es könnte auch sein, dass der Compiler die Zeile
i:=0; wegoptimiert, da sie anschliessend als Schleifenzähler genutzt wird.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#5

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 22. Jan 2007, 23:39
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 22. Jan 2007, 23:54

Noch ein ratloser Ansatz:
Wie übergibst du denn points in calcpoints?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#7

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 23. Jan 2007, 09:31
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).
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.926 Beiträge
 
Delphi 12 Athens
 
#8

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 23. Jan 2007, 10:27
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"
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+}
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 23. Jan 2007, 11:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Seltsamer fehler bei prozedurabarbeitung

  Alt 23. Jan 2007, 11:10
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  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 10:36 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