![]() |
Fehler beim Einsatz von Schleife
Hallo,
ich programmiere zur Zeit ein "game of life", welches auch fehlerfrei läuft. Mit einer Prozedur ermittle ich alle benachbarten Felder eins Feldes Feld[x|y], wobei 'k' die Anzahl der bisherigen Nachbarn ist:
Delphi-Quellcode:
So klappt alles einwandfrei, doch wenn ich dasselbe mit einer Schleife lösen will, kappts irgendwie nicht mehr :wiejetzt:
If Feld[x,y+1] = 1 then inc(k,1);
If Feld[x+1,y+1] = 1 then inc(k,1); If Feld[x+1,y] = 1 then inc(k,1); If Feld[x+1,y-1] = 1 then inc(k,1); If Feld[x,y-1] = 1 then inc(k,1); If Feld[x-1,y-1] = 1 then inc(k,1); If Feld[x-1,y] = 1 then inc(k,1); If Feld[x-1,y+1] = 1 then inc(k,1);
Delphi-Quellcode:
Finde den Fehler nicht :gruebel:
For i := x-1 to x+1 do
For j := y-1 to y+1 do If (i<>x)and(j<>y)and(Feld[i,j] = 1) then inc(k,1); |
Re: Fehler beim Einsatz von Schleife
Sieht auf den ersten Blick richtig aus, was genau geht denn nicht?
|
Re: Fehler beim Einsatz von Schleife
Hier nochmal die ganze Prozedur:
Delphi-Quellcode:
Ich habe gerade mal ein kleines Array mit Nullen gefüllt, bis auf die Felder [1,1][2,1][3,1], diese mit einer 1;
procedure p_Nachbarn(x,y:integer);
var i,j,k:integer; begin k := 0; { das funktioniert If Feld[x,y+1] = 1 then inc(k,1); If Feld[x+1,y+1] = 1 then inc(k,1); If Feld[x+1,y] = 1 then inc(k,1); If Feld[x+1,y-1] = 1 then inc(k,1); If Feld[x,y-1] = 1 then inc(k,1); If Feld[x-1,y-1] = 1 then inc(k,1); If Feld[x-1,y] = 1 then inc(k,1); If Feld[x-1,y+1] = 1 then inc(k,1); } For i := x-1 to x+1 do For j := y-1 to y+1 do If (i<>x)and(j<>y)and(Feld[i,j] = 1) then inc(k,1); Nachbarn := k; end; Die einzelne Abfrage hat mir für das Feld[2,2] 3 zurückgegeben - was korrekt ist, die Schleife aber nur 2. |
Re: Fehler beim Einsatz von Schleife
Zitat:
der Fehler liegt in der if Bedingung. Damit schließt Du alle Fälle aus mit Feld[x,irgendwas] und Feld[irgendwas,y] also z.B. Feld[x,y+1] usw. schreibe stattdessen:
Delphi-Quellcode:
Gruß
if (not ((i=x) and (j=y))) and (Feld[i,j]=1) then inc(k,1);
Ulrich |
Re: Fehler beim Einsatz von Schleife
ahh, danke, war wohl schon ein wenig zu spät :zwinker:
|
Re: Fehler beim Einsatz von Schleife
Delphi-Quellcode:
Das lösen wir jetzt noch schön auf, nach den De-Morgan'schen Regeln:
if (not ((i=x) and (j=y))) and (Feld[i,j]=1) then inc(k,1);
Delphi-Quellcode:
if (i<>x) or (j<>y) and (Feld[i,j]=1) then inc(k,1);
|
Re: Fehler beim Einsatz von Schleife
Die ursprüngliche Logik sollte man aber erhalten:
Delphi-Quellcode:
Gruß Hawkeye
// if (i<>x) or (j<>x) and (Feld[i,j]=1) then inc(k,1);
if ((i <> x) or (j <> y)) and (Feld[i, j] = 1) then Inc (k); |
Re: Fehler beim Einsatz von Schleife
Das j=x war ein Tippfehler, aber das andere stimmt schon so. Or bindet genauso stark wie and, und wenn keine Unterschiede in der Bindungsstärke da sind, wird einfach von links nach rechts abgearbeitet, daher brauchst du das ganze nicht zu klammern.
|
Re: Fehler beim Einsatz von Schleife
Hallo Manuel,
Zitat:
Gruß Hawkeye |
Re: Fehler beim Einsatz von Schleife
Kommt drauf an. In der Rechnerarchitektur wird es oft so gesehen, in der Aussagen- und Prädikatenlogik sind and und or gleich stark bindend. In Delphi übrigens auch, habs grade ausprobiert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 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