![]() |
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.
|
Re: Fehler beim Einsatz von Schleife
Zitat:
Zitat:
Delphi-Quellcode:
Gruß Hawkeye
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; var a, b, c : Boolean; begin WriteLn; WriteLn ('X = a or b and c'); WriteLn ('Y = (a or b) and c'); WriteLn ('Z = a or (b and c)'); WriteLn; WriteLn ('abc X Y Z'); WriteLn ('----------'); for a := False to True do for b := False to True do for c := False to True do WriteLn (Format('%d%d%d %d %d %d', [Ord(a), Ord(b), Ord(c), Ord(a or b and c), Ord((a or b) and c), Ord(a or (b and c))])); end. |
Re: Fehler beim Einsatz von Schleife
Zitat:
Zweitens: Ich würde zusätzlich klammern bei Deiner Lösung, egal, wie die Bindungsregeln nun zufällig sind. Drittens: Ich finde meine Lösung weiterhin anschaulicher. Symbolisch lautet meine Lösung ja: if (not Ausnahmefall) and (Feld[i,j]=1) then inc(k,1); der Ausnahmefall wird aufgelöst als ((i=x) and (j=y))). Bei Deiner Lösung muss man (ich jedenfalls) kurz nachdenken (letztlich versteckst Du das not in das <>). |
Re: Fehler beim Einsatz von Schleife
Okay, Hawkeye, du hast offenbar Recht. Die Ausgabe meines Testprogramms hab ich offenbar falsch interpretiert. Außerdem bin ich es aus der Mathematik gewöhnt, dass die Konjunktion so stark bindet wie die Disjunktion, die Implikation und Äquivalenz weniger stark und die Negation am stärksten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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