Autor Beitrag
gerd33
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 24.05.20 21:12 
Hallo,

ich glaube ich habe einen Compiler Fehler entdeckt. Zumindest kann ich mir nicht erklären, wie ein boolean Ausdruck im_schach true ist.
Kann ich zum besseren Verständnis den ganzen Code hier senden? Ist nur eine Unit. Wie kann ich diese Datei hier uploaden?
Oder wer hat Interesse, dann schicke ich es zu?

Verdammt heute den ganzen Sonntag nur damit verbracht, wieso im_schach true ist. Obwohl ich es vorher immer false setze.

Gerd

Moderiert von user profile iconNarses: Topic aus Algorithmen, Optimierung und Assembler verschoben am So 24.05.2020 um 22:24
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 24.05.20 22:24 
Hallo und :welcome: in der Entwickler-Ecke!

Im Beitragseditor gibt es unten rechts einen Link "Dateianhang hinzufügen". Darüber solltest du deine Unit anhängen können.

Vielleicht helfen aber auch schon Ausschnitte aus der Datei.

So ins Blaue geraten: man vergleicht ja nicht per if im_schach = True then, sondern durch if im_schach then. In der ersten Variante können schon mal Nebeneffekte auftreten. Oder es gibt ein Problem mit globalen und lokalen Variablen ...

_________________
We are, we were and will not be.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 24.05.20 22:26 
...oder eine Bereichsüberschreitung (und Speicher wird ungewollt überschrieben)... :nixweiss:

_________________
There are 10 types of people - those who understand binary and those who don´t.
gerd33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 24.05.20 22:58 
Frage:

ausblenden Delphi-Quelltext
1:
2:
// Merkwuerdig, darf normalerweise niemals im_schach true sein.
if im_schach then memo2.lines.add('im schach'+inttostr(k1));


Das dürfte er meiner Meinung niemals ausgeben. Warum macht er das.

Gerd
Einloggen, um Attachments anzusehen!
LorenzS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: So 24.05.20 23:28 
Hallo,

vielleicht hilft es die Variable in der Procedere TForm1.loesen mal mit false zu initialisieren.
Ansonsten ist ein Zufälliger werte aus dem Speicher genommen, der je nach Kompilation auch ändern kann.
gerd33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 24.05.20 23:37 
Ich sage vor jedem Turm Aufruf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
im_schach:=false;
for v:=1 to 10 do begin
  if wT[v]<>0 then begin
    im_schach:=false;
    //
    turm(true,bitschau1(wT[v]),v,4,true,bitschau1(sK));
    if im_schach then begin
      im_schach:=false;
      weiter1:=false;
    end;
  end;
end;

Vor jedem turm() Aufruf setze ich die globale Variable schach:=false;
Keinem Zufall überlassen.

Gerd

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
gerd33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 24.05.20 23:47 
Ich bin mir nicht ganz sicher, aber ich habe einen grossen Verdacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
begin
  //horizontal
  u_magic:=71213169107795968;
  turm2bis7(48,50,51,52,53,54,55,49,51,52,53,54,55,56,50,2);

  //vertikal
  u_magic:=144117395722732034;
  turm2bis7(1,9,17,25,33,41,57,2,10,18,26,34,42,58,50,7);
end;


Der fuehrt das ja 2-fach aus. Ich glaube daran liegt es. Das kann man natuerlich ganz einfach beheben, indem man ganz oben das im_schach:=false setzt.
Ich muss nochmal eine Nacht darüber schlafen.

Gerd

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 24.05.20 23:56 
Das ist das Problem mit globalen Variablen:
Man hat nicht den Überblick warum diese wo gesetzt werden.

Um das Logikproblem zu finden musst du doch nur einen Haltepunkt auf die einzige Zeile setzen, in der die Variable auf True gesetzt wird. Sobald du dort ankommst, kannst du doch anschauen wo das Problem liegt.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 25.05.20 09:55 
Der Code ist mal wirklich verworren. :shock:

Die Variable im_schach ist in TForm1.loesen deklariert, die satte 1500 Zeilen Code enthält. Darin enthalten sind (mindestens) zwei Ebenen von verschachtelten Prozeduren, wobei z.B. turmtest (eingebettet in der in loesen eingebetteten Prozedur turm) wieder die Eltern-Prozedur aufruft ...

Ich fürchte, da kommst du mittelfristig nicht um ein komplettes Redesign herum. Wo genau die Variable ungewollt gesetzt wird, ist ohne Debugger absolut undurchschaubar für mich.

_________________
We are, we were and will not be.
gerd33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mo 25.05.20 14:41 
Ich habe jetzt den source code geändert.
Und es funktioniert einwandfrei, so wie ich mir das jetzt vorstelle.
Ich kann das nachvollziehen, dass alles verworren ist.
Den Selbstaufruf der procedure turm(... probe) wird jedenfalls nicht ganz ausfuehrt , sondern nur die Probe.
Damit spare ich mir nochmal eine procedure mit allen 64 Feldern zu schreiben.
Das ist mit den Türmen nicht ganz leicht zu verstehen, das gebe ich zu. Ist aber soweit mir bekannt die schnellste Art mit dem Zuggenerator, die
Türme werden im Look-up nach min max (bessere waere hier links und rechts) abgefragt.
(Und dass ich nicht der beste Programmierer bin, habe ich auch nie behauptet)

Gerd
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 25.05.20 15:21 
user profile icongerd33 hat folgendes geschrieben Zum zitierten Posting springen:
Das ist mit den Türmen nicht ganz leicht zu verstehen, das gebe ich zu. Ist aber soweit mir bekannt die schnellste Art mit dem Zuggenerator, die Türme werden im Look-up nach min max (bessere waere hier links und rechts) abgefragt.

Ja, dass da irgendein "bekannter" Algorithmus abläuft, habe ich mir schon gedacht. Wenn so viele "Magic Numbers" irgendwo auftauchen, steckt meistens etwas mehr dahinter als "Ich bastel mir da mal was zusammen". :think:

Ist halt nur so, dass bei einigen Diskussionen zu "Wie lang darf eine Prozedur sein" gelegentlich Aussagen kommen wie "maximal eine Bildschirmseite". Dieses Extrem ist sicher nicht immer einzuhalten, aber so ein "Monster" wie das hier steht dann auf der anderen Seite der Extrembeispiele.

Ob man das sinnvoll in eine Klassenstruktur umändern kann, mit einigen privaten Prozeduren/Funktionen/Variablen etc. kann ich auf Anhieb auch nicht überblicken. Kann auch sein, dass man dann so viel Overhead rein bekommt, dass der Vorteil des Verfahrens auch wieder flöten geht ...

Wenn es jetzt läuft, ist ja erstmal alles in Ordnung. :zustimm:

_________________
We are, we were and will not be.