//Gleiche Beitrag bei dem anderem Crosspost
Sry für Doppelpost. Topic soll nur wieder als aktuell gekennzeichnet werden.
Also der Fehler muss in der Schleife liegen. Habe eine 2. Variante mir ausgedacht, welche jedoch auch nicht funktioniert.
Die Zahl bis 3 geht wunderbar. Sobald er aber die 4 durchrasseln soll ist Schluss.
Es kommt dann zu einem Stack Overflow bzw. Aufhängen des Programmes
Iterartiv - Programm bleibt hängen
Delphi-Quellcode:
procedure TForm1.berechnen(x,y,zahl:integer);
var col,row,hilfe:integer;
begin
col:=random(3)+ x; //x gibt den Wert des Unterbereiches an
row:=random(3)+ y;
hilfe:=strtoint(form1.Feld.Cells[col,row]); //liest den Wert der Zelle aus (es werden alle Zellen vorher mit 0 beschrieben
while not (hilfe=0) do
begin
while col in XCol do //Xcol beinhaltet die Werte der geblockten Spalten
begin
col:=random(3+x);
while row in Xrow do
begin
row:=random(3)+ y
end;
end;
hilfe:=strtoint(form1.Feld.Cells[col,row]);
end;
form1.Feld.Cells[col,row]:=inttostr(zahl); //Schreiben der Zahl in die Zelle
Xrow:= Xrow + [row]; //Zeile wird geblockt
Xcol:= Xcol + [col]
Und bei dem hier kommt es zum Stack Überlauf. Dies liegt daran, dass ich die Procedure selber immer wieder aufrufe und dadurch der Speicher zu extrem ausgelastet wird.
Weiß leider nicht wie ich die Procedure umschreiben könnte.
Delphi-Quellcode:
procedure TForm1.berechnen(x,y,zahl:integer);
var col,row,hilfe:integer;
begin
col:=random(3)+ x;
row:=random(3)+ y;
if then berechnen(x,y,zahl,dlauf) //wenn Spalte bereits belegt
else
begin
if then berechnen(x,y,zahl,dlauf) //wenn Zeile bereits belegt
else
begin
if hilfe in zahlen then //prüft ob Zelle bereits belegt ist
begin
berechnen(x,y,zahl,dlauf); //ruft sich selber nochmal auf
end
else
begin
form1.Feld.Cells[col,row]:=inttostr(zahl); //Schreiben der Zahl
zelle[col,row]:=zahl; //Für das abspeichern der Werte
Xrow:= Xrow + [row]; //Mengenvariable wird erhöht
Xcol:= Xcol + [col]
end;
end;
end;
end;
Der generell Quelltext ist oben zu sehen. Aber in dieser Procedure liegt der Fehler. Bei 1-3 geht es wunderbar. Bei der Zahl 4 bricht er jedoch beim achten Unterquadrat ab, obwohl die
case of vorgegeben ist und er nur reinspringen muss.