Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mir For-Schleife?


jackie05 - Mo 07.02.11 05:23
Titel: Probleme mir For-Schleife?
Hallo,
ich versuche schon seit paar Stunden mein problem zu lösen, leider ohne erfolg.
Die For-Schleife zählt irgendwie nicht mehr korrekt und davor hat alles Wunderbar funktioniert.

Hier mal die Schleife:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  //for j:=0 to 8 do begin
    for y:=0 to 2 do begin
      for x:=0 to 2 do begin
        if (Spielfeld[x][y].Wert > 0then
        begin
          for yy:=y to 2 do begin
            for xx:=(x+1to 2 do begin
              if (Spielfeld[xx][yy].Wert = Spielfeld[x][y].Wert) then
              begin
                Form1.Caption := 'Test: Wird ausgeführt!';
              end;
            end;
          end;
        end;
      end;
    end;
  //end;


Ich weiss nicht ob es an Delphi oder an mir liegt, weil ich erkenne bei meinem Code wirklich keinen Fehler.
Bis Zeile 4 funktioniert alles Wunderbar, nur die Schleife danach funktioniert einfach nicht mehr korrekt.

Ich bedanke mich schonmal im Voraus.

MfG


Delete - Mo 07.02.11 05:38

WAS funktioniert nicht und welche Schleife danach? Ich sehe da nur verschachtelte Schleifen.


jaenicke - Mo 07.02.11 06:32

Kann es sein, dass du einfach nur im Debugger schaust und dort falsche Werte für die Schleifenvarialen siehst?
Das liegt dann einfach nur an der Compileroptimierung, funktionieren tut es trotzdem richtig.


Bergmann89 - Mo 07.02.11 11:01

Hey,

hast du das Spielfeld-Array richtig initialisiert? Wenn die Indices der Schleifen größer sind als der reservierte Speicher des Array. Dann überschreibst du Speicher der mit dem Array nix zu tun hat un da führt dann zu komischen Fehlern...

MfG Bergmann.


jackie05 - Mo 07.02.11 11:48

Danke euch für die antworten.

Die Felder sind schon richtig initialisiert worden, wenn ich die verschachtelte Schleifen auf 0 setze, dann funktioniert das:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
//for j:=0 to 8 do begin
    for y:=0 to 2 do begin
      for x:=0 to 2 do begin
        if (Spielfeld[x][y].Wert > 0then
        begin
          for j:=0 to 2 do begin
            for i:=0 to 2 do begin
              if not (i = x) then
              begin
                if not (j = y) then
                begin
                  if (Spielfeld[i][j].Wert = Spielfeld[x][y].Wert) then
                  begin
                    Form1.Caption := 'Test: Wird ausgeführt!';
                    Spielfeld[x][y].Doppelt := 1;
                    Spielfeld[i][j].Doppelt := 1;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  //end;


Aber ich möchte das die Schleife ab dort Weiter läuft, wo Spielfeld[x][y].Wert > 0 ist, das will aber irgendwie nicht funktionieren.

so funktioniert es:

Delphi-Quelltext
1:
2:
for j:=0 to 2 do begin
for i:=0 to 2 do begin


und das hier funktioniert irgendwie nicht:

Delphi-Quelltext
1:
2:
for j:=y to 2 do begin
for i:=(x+1to 2 do begin


Woran könnte das denn liegen?

MfG


jackie05 - Mo 07.02.11 12:41

Ich habe das jetzt hinbekommen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
for y:=0 to 2 do begin
        for x:=0 to 2 do begin
          if (Spielfeld[x][y].Wert > 0then
          begin
            z := (x+1);
            for j:=y to 2 do begin
              for i:=z to 2 do begin
                if (Spielfeld[i][j].Wert = Spielfeld[x][y].Wert) then
                begin
                  Form1.Caption := 'Test: Wird ausgeführt!';
                  Spielfeld[x][y].Doppelt := 1;
                  Spielfeld[i][j].Doppelt := 1;
                end;
              end;
              z := 0;
            end;
          end;
        end;
      end;


Der fehler lag daran, das die Schleife

Delphi-Quelltext
1:
for i:=(x+1to 2 do begin                    

niemals die 0 erreicht hat, deshalb habe ich eine neue Viariable erstellt namens z und habe dort die zuweisung

Delphi-Quelltext
1:
z := (x+1);                    

gemacht und nach jede j durchlauf setze ich sie wieder auf 0.

Ich danke euch trotzdem für die Hilfe.

Edit: Ups, Sry wegen Doppelpost, mir ist das jetzt erst aufgefallen.

MfG


jaenicke - Mo 07.02.11 12:54

Heißt aber auch, dass nur bei j = y die innere Schleife i bei x + 1 losläuft und sonst bei 0. Wenn das so gewollt ist, ist das ja ok...


jackie05 - Mo 07.02.11 13:14

Ja, das möchte ich so. ;-)
Ich bin dabei ein Sudoku Spiel zu schreiben und ich prüfe die Felder auf doppelte Zahlen, weil ich auch die 3*3 Feld blöcke auf doppelte Zahlen prüfen möchte.

Also, wenn Spielfeld[x][y].Wert > 0 ist, dann läuft die verschachtelte Schleife weiter, und da nicht das gleiche Feld auf doppelte Zahl geprüft werden soll, addiere ich einfach z := (x+1) dazu und j kann den gleichen Wert wie y haben.

MfG


jaenicke - Mo 07.02.11 13:29

Hier habe ich übrigens einmal ein ähnliches Programm geschrieben, vielleicht interessiert es dich ja:
http://www.delphi-forum.de/viewtopic.php?t=48160


jackie05 - Mo 07.02.11 14:19

Vielen Dank.
Ich werde mal bei gelegenheit gucken.

Im Moment komme ich gut voran. ;-)

MfG


Tilman - Mo 07.02.11 14:41

Ich empfehle dir, deine ends zu kommentieren

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
                end// if (Spielfeld[i][j]
              end// for i
              z := 0;
            end// for z
          end// if (Spielfeld[x][y]
        end// for x
      end// for y


Marc. - Mo 07.02.11 14:55

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
Ich empfehle dir, deine ends zu kommentieren

Alternativ oder sogar zusätzlich könntest Du auch das CnPack [http://www.cnpack.org/showdetail.php?id=456&lang=en] verwenden. Wie dem Screenshot im Anhang zu entnehmen ist, wird das ganze damit ziemlich farbenfroh. Die Zuordnung lässt sich beqeuem via Shortcut zu- und abschalten. :)


Tintenblut - Mo 07.02.11 15:02

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Empfehlenswert, wenn man Augenkrebs bekommen will ;)
Wenn sich dann jemand auf nem anderen Client den Source anschauen will, muss er das Pack auch installiert haben?


Marc. - Mo 07.02.11 15:03

user profile iconTintenblut hat folgendes geschrieben Zum zitierten Posting springen:
Wenn sich dann jemand auf nem anderen Client den Source anschauen will, muss er das Pack auch installiert haben?

Nein, das wirkt sich ja nur auf die Darstellung in der IDE aus. Mit dem Code oder dem Projekt an sich hat das also gar nichts zu tun.


Tintenblut - Mo 07.02.11 15:10

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Sorry. War eine rein rhetorische Frage :)
Da meines Erachtens das Kommentieren des Quelltextes nicht nur für den Programmierer selbst wichtig ist ^^


sky21 - Mo 07.02.11 17:27

OT: Mir fällt auf, dass in letzter Zeit hier vermehrt Code mit Deutschen Wörtern gepostet wird. Wird dies an deutschen Schulen tatsächlich so doziert oder passiert dies einfach aus Unwissenheit?

Der Sprachmix wie "If MeinWert then" sieht doch einfach Schei** aus. Punkt.

Die eigene Sprache in aller Ehre, aber ein irgendwo muss es doch auch Grenzen geben.

PS: Unser Dozent hat damals gesagt, wer ein in's Deutsche übersetze Programmierer-Buch liest, liest veraltetes Wissen ;-)


jaenicke - Mo 07.02.11 17:40

Die meisten können vermutlich einfach schlicht nicht so gut Englisch. ;-)

Ich meine, wenn mir eine Sprache nicht so gut sitzt, würde ich die auch nicht gerne für Bezeichner nutzen. einfach, weil ich es dann später schlecht selbst lesen kann.

Dass es als Softwareentwickler eigentlich eine Selbstverständlichkeit ist, Englisch zu können (und dort dann auch zu nutzen), ist eine andere Sache. Das gilt ja nicht für Schüler. ;-)


Tilman - Mo 07.02.11 17:48

user profile iconsky21 hat folgendes geschrieben Zum zitierten Posting springen:
OT: Mir fällt auf, dass in letzter Zeit hier vermehrt Code mit Deutschen Wörtern gepostet wird. Wird dies an deutschen Schulen tatsächlich so doziert oder passiert dies einfach aus Unwissenheit?

Bei uns früher wurden in der Schule tatsächlich meist deutsche Bezeichner verwendet, ich wüsste auch nicht was daran verkehrt sein soll, oder gar mit Unwissenheit zu tun haben soll :gruebel: da geht es ja darum, dass der Schüler es versteht, und nicht dass es schön aussieht, oder international verständlicher Code entsteht.


Hobby-Programmierer - Di 08.02.11 17:38

Ich würde sogar behaupten das es gerade für Anfänger nicht so leicht ist aus fremden Code zu lernen bzw. bei eigenem Code Fehler zu finden wenn alles einheitlich in Englisch geschrieben wurde.
Zumindest mein Sohn tat sich da unheimlich schwer, weswegen wir alles selbsterstellte anfangs 'eingedeutsch' haben.


jaenicke - Di 08.02.11 18:34

Das liegt aber wie gesagt an den Sprachkenntnissen. Wer nicht so gut Englisch kann, kommt eben nicht so gut damit klar. Wer gut Englisch kann, für den macht es wohl kaum einen Unterschied. Ich realisiere z.B. bei einem englischen Text oder Bezeichner gar nicht mehr, dass es Englisch ist.