![]() |
procedure abbrechen bzw. warum läuft sie weiter? ^^
Mal wieder ein Hallöchen von mir :)
Wie ihr euch sicherlich denkt, hab ich ein Problem :) Und zwar folgendes: Ich starte meinen Lösungsvorgang über einen Button, der dann verschiedene Aktionen duchführt und eine procedure triggert. In dieser ist eine while Schleife, welche jedoch immer wieder aufgerufen wird nachdem mein Programm eigentlich fertig sein sollte. Ich hab es schon mit exit und application.ProcessMessages versucht, jedoch keinen Erfolg gehabt. Es scheint fast so als würde er über den Punkt rüber zur letzten Schleife gehen die er findet. Ich versuche mal wichtigen Quellcode zu posten, wenn was fehlen sollte müsstet ihr mir bescheid sagen.
Delphi-Quellcode:
So far...^^
procedure TForm1.BackTracking(var Nr,INr :integer);
begin While Nr <> 82 do begin ZahlZuKoordinaten(Nr); b := xKoo-1; c := yKoo; if Nr >= 82 then break; if INr = 9 then begin Nr := Nr-1; INr := Positionsarray[Nr-1,0]+1; sudokuarray[b,c] := 0; Backtracking(Nr,INr); end; if Moeglichkeitenarray [Nr-1,INr] = 0 then begin if INr = 0 then begin if richtung = 0 then begin Nr := Nr-1; INr := positionsarray[Nr-1,0]+1; richtung := 0; BackTracking(Nr,INr) end else begin Nr := Nr+1; INr := 0; richtung := 1; Backtracking(Nr,INr); end; end; begin if Moeglichkeitenarray[Nr-1,0] <> 0 then sudokuarray[b,c] := 0; Nr := Nr-1; INr := (Positionsarray[Nr-1,0])+1; Richtung := 0; Backtracking(Nr,INr); end; end; If Moeglichkeitenarray [Nr-1,INr] <> 0 then begin sudokuarray[b,c] := Moeglichkeitenarray[Nr-1,INr]; d := Moeglichkeitenarray[Nr-1,INr]; Reihe(b,c); if e = 1 then Spalte(b,c); if e = 1 then Kasten(b,c); if e = 1 then begin Positionsarray[Nr-1,0] := INr; Nr := Nr+1; INr := 0; Richtung := 1; BackTracking(Nr,INr); end; if e <> 1 then begin if INr <> 8 then begin INr := INr + 1; BackTracking(Nr,INr); end else begin Richtung := 0; Nr := Nr-1; INr := (Positionsarray[Nr-1,0])+1; sudokuarray[b,c] := 0; Backtracking(Nr,INr); end; end; end; end; Application.ProcessMessages; Uebertragen(); end; end. |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Du kannst mit geschweiften Klammern Blöcke auskommentieren
und so erst einmal den Fehler einkreisen. |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Das is mir schon klar, nur wenn ich was auskommentiere kommt es 100% zum Stack Überlauf^^ (sprich ich habs schon ausprobiert) :)
|
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Mach mal das hier:
Delphi-Quellcode:
Und deine Abbruchbedingung einfach weglassen....
{...}
While Nr < 82 do {...} |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Davon abgesehen das "while Nr < 82" wirklich besser ist, klappt es immer noch nicht. Was meintest du mit Abbruchbedingung? Meintest du das Application.ProcessMessages?
|
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Ich will Dir ja nicht zu nahe treten, aber Deine Formatierung ist fürchterlich. Zumindest ich kann auf die Schnelle nicht erkennen, wo die Schleife eigentlich zu Ende sein soll. Und mit der "Abbruchbedingung" ist vermutlich das break gemeint.
|
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Hab fast befürchtet das man auf die Formatierung noch zu sprechen kommt^^ ich werd mir mal dieses "how-to-formatier-deinen-code" reinziehen :) bisher hatte es halt gereicht, das ICH weiß was da steht^^
Jedoch hat sich leider weiterhin nix verändert. |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Zitat:
Ich habe eben mal versucht, den Code im Kopf durchzugehen, bin aber zu keinem Ergebnis gekommen, weil ich durch den Spaghetticode nicht durchblicke. Was mir aber aufgefallen ist, sind aber immer wieder ähnliche Muster, z.B.:
Delphi-Quellcode:
Warum fragst du den Wert von e hier vier mal direkt hintereinander ab? Fasse sowas zusammen, denn solcher Code ist (insbesondere durch die irreführende Einrückung) unleserlich und verwirrend.
Reihe(b,c);
if e = 1 then Spalte(b,c); if e = 1 then Kasten(b,c); if e = 1 then begin Positionsarray[Nr-1,0] := INr; Nr := Nr+1; INr := 0; Richtung := 1; BackTracking(Nr,INr); end; if e <> 1 then begin
Delphi-Quellcode:
Ebenfalls irreführend ist sowas:
Reihe(b,c);
if e = 1 then begin Spalte(b,c); Kasten(b,c); Positionsarray[Nr-1,0] := INr; Nr := Nr+1; INr := 0; Richtung := 1; BackTracking(Nr,INr); end else begin ...
Delphi-Quellcode:
Auf den ersten Blick könnte man vermuten, dass alle diese Zeile von der Bedigung abhängig sind. Tatsächlich ist es aber nur die erste, die anderen werden immer ausgeführt.
if Moeglichkeitenarray[Nr-1,0] <> 0 then
sudokuarray[b,c] := 0; Nr := Nr-1; INr := (Positionsarray[Nr-1,0])+1; Richtung := 0; Backtracking(Nr,INr); Usw... Rücke deinen Code ordentlich ein, fasse so weit wie möglich zusammen, und lagere redundante Codeteile in Subroutinen aus - glaub mir, es lohnt sich. Und ich wette, dass dir der Fehler sofort in die Augen springt, wenn du den Code mal ordentlich strukurierst. :wink: |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Formatierung des Codes hat geholfen^^ Ich hab ein paar ends falsch gesetzt :)
Danke euch für eure Hilfe :corky: |
Re: procedure abbrechen bzw. warum läuft sie weiter? ^^
Eine gute Anleitung zur u.a. Codeformatierung findet man
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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