Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife Zählt Falsch, versteht einer warum ? [ gelöst ] (https://www.delphipraxis.net/127537-schleife-zaehlt-falsch-versteht-einer-warum-%5B-geloest-%5D.html)

Corpsman 15. Jan 2009 06:22


Schleife Zählt Falsch, versteht einer warum ? [ gelöst ]
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen Leuts,

ich hab hier ein Problem das ich absolut nicht verstehe.

Habe die Bereichsüberprüfung ebenfalls im Compiler angemacht, aber selbst dann mekert er nicht sondern erzeugt einfach diesen Blödsinn.

Was er macht ..

ich habe folgenden Code :
Delphi-Quellcode:
For j := 0 To 4 {high(arr)} Do Begin
          If Valid[j, length(arr[0]) - 3] = 2 Then Begin
            c := false;
            break;
          End;
          // Check ob wirs geschafft haben..
//          Was soll der Scheis die Addressierung in Arr geht 0
//          If arr[length(arr[0]) - 3, j] <> '0' Then d := false;

          If arr[j, stringlength - 2] <> '0' Then d := false;
Wie man sieht habe ich j mittlerweile auf feste grenzen gesetzt, aber selbst dann läuft j laut debugger von 5 .. 0 Runter. Klar das dann Blödsinn rauskommt. und meine ganze Programmlogic beim Teufel ist.

Wers nicht glaubt sieht sich den Screenshot an.

nuclearping 15. Jan 2009 06:29

Re: Schleife Zählt Falsch, versteht einer warum ?
 
Wie sind denn j, Valid und arr deklariert?

worker 15. Jan 2009 07:05

Re: Schleife Zählt Falsch, versteht einer warum ?
 
Ohne mir weitere Gedanken zu machen, oder mir Deinen Code großartig angesehen zu haben -> vielleicht hilft's

Corpsman 15. Jan 2009 07:10

Re: Schleife Zählt Falsch, versteht einer warum ?
 
Delphi-Quellcode:
Var
 j: Integer;
als Lokale Variable

der Rest Global
Delphi-Quellcode:
Const
  StringLength = 9;
    arr: Array[0..4, 1..9] Of char = (
      '12531 1 1',
      '34109 1 1',
      '9-342 2 2',
      '39458 2 2',
      '51545 2 2'
      );


Var
  valid: Array[0..high(arr), 1..6] Of integer;
  tmpres: String[5];
Der Irrwitz ist das wenn ich
Delphi-Quellcode:

if ( i < 0) or ( i > 4 ) then raise exception.create( 'fehler');
kommt die AV nicht.

Wenn ich aber ein d := False einbaue dann stimmts wieder

Delphi-Quellcode:
        // 1. Check ob irgend ein Rotes Feld ist, wenn ja abbruch
        For j := 0 To high(arr) Do Begin
          If Valid[j, length(arr[0]) - 3] = 2 Then Begin
            c := false;
            d := false; // <-- Das eingefügt und es stimmt wieder
            break;
          End;
          // Check ob wirs geschafft haben..
          If arr[j, stringlength - 2] <> '0' Then d := false;
        End;
@worker

ja alle schleifen laufen Rückwärts wenn der Kompiler merkt das die Laufrichtung egal ist. das macht er weil er sie damit dann schneller laufen lassen kann. Das ansich stört auch nicht. Nur eben das er bei 5 begint.

hoika 15. Jan 2009 07:14

Re: Schleife Zählt Falsch, versteht einer warum ? [ gelöst ]
 
Hallo,

auf Schleifenvariablen sollte man nie ausserhalb der Schleife zugreifen.
Der Compiler sollte dich eigentlich warnen.


Lösung:
Benutze eine zusätzliche Variable, die du hochzählst
und nach der Schleife prüfst.


Heiko

Angel4585 15. Jan 2009 07:14

Re: Schleife Zählt Falsch, versteht einer warum ?
 
Um die Frage zu beantworten, eine FOR-Schleife funktioniert soweit ich weis so:

sie zählt die Variable um eins hoch, und prüft ob sie noch in die Bedingung passt(hier:zwischen 0 und 4)
Wenn ja, springt sie in den Code der For-Schleife rein, wenn nicht(zb. > 4) dann ist die For-Schleife zuende, die Variable hat dann aber auf jedenfall einen Wert der nicht im Bereich zwischen 0 und 4 liegt.

Sprich: Deine Schleife zählt von 0 hoch, wenn die Variable den Wert 5 hat springt die raus und hat deswegen nach der Schleife auch den Wert 5

hoika 15. Jan 2009 07:18

Re: Schleife Zählt Falsch, versteht einer warum ? [ gelöst ]
 
Hallo,

Falls die Schleifen-Variable innerhalb der Schleife nicht benötigt wird,
oder die Reihenfolge egal ist, wird runtergezählt.
Die Variable kommt dazu in ax/eax.

Per jnz (jump not zero) wird geprüft, ob die Variable (genauer das Registerx)
nicht schon 0 ist, wenn nicht springt er wieder an den Scheifenanfang.
Das jnz ist schneller als ein cmp ax, 5.


Heiko

Corpsman 15. Jan 2009 07:27

Re: Schleife Zählt Falsch, versteht einer warum ? [ gelöst ]
 
@hoika

Zitat:

Hallo,

auf Schleifenvariablen sollte man nie ausserhalb der Schleife zugreifen.
Der Compiler sollte dich eigentlich warnen.
das mache ich doch gar nicht. Denn wenn würde es der Compiler tatsächlich anprangern.

hoika 15. Jan 2009 07:35

Re: Schleife Zählt Falsch, versteht einer warum ? [ gelöst ]
 
Hallo,

ui,

stimmt ;) übersehen.

Trotzdem,
probier mal eine zusätzlixhe Variable.



Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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