Autor Beitrag
Zürrer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: Fr 25.07.14 12:15 
Liebe hilfreiche Gemeinde!
Ich bin ein alter Mann mit bald 94 Jährchen am Buckel, beschäftige mich jedoch noch immer mit meinem alten Delphi2 Programm. Momentan ist das ein Sudoku-Lösungs-Programm. Jetzt kommt eine ganz primitive Frage auf, für die ich keinen Zugang habe. Deshalb meine Frage an Euch.
Es dürfte am besten sein, wenn ich den Text direkt vorlege.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1….. 
var 
,,,,,, 
Found: boolean; 
...... 
procedure Compare (Paar: integer); 
var 
……. 
begin 
Found := false;

Es gibt also ein umfassendes Haupt-Procedure, in das ein Spezial-Procedure eingebunden ist. Das Wort „Found“ ist als boolean im Hauptprogramm definiert und wird im Unterprogramm benützt, natürlich am Anfang als false definiert und dann den Umständen entsprechend in vrai gewandelt. Wenn im Unterprogramm keine Veranlassung besteht, Found in vrai umzuwandeln, wird trotzdem am Ende der Procedure diese Umwandlung durch das Programm selbst durchgeführt, wodurch man mit diesem setup nicht arbeiten kann.
Ich bin ratlos und hoffe auf Eure Hilfe. Bereits jetzt schon besten Dank für Eure Mühe und recht freundliche Grüsse aus dem ziemlich heissen Basel.
Egon Zürrer
Steinenring 12
CH-4051 Basel

Moderiert von user profile iconNarses: 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: Fr 25.07.14 13:15 
Hallo,

aus dem geposteten Teil des Quelltextes lässt sich nicht erkennen wo der Wert überall geändert wird, deshalb kann man so erst einmal nicht viel dazu sagen.
Zum Debuggen würde ich auf alle Zeilen nach einer Zuweisung an Found einen Haltepunkt setzen und in dessen Eigenschaften (ich hoffe das ging bei Delphi 2 schon) die Bedingung Found = True setzen. Dann springt der Haltepunkt nur an, wenn der Wert entsprechend gesetzt ist. Aus dem Kontext könnte sich der Fehler erkennen lassen.

Im Forum werden wir nur mit etwas mehr Quelltext helfen können, denn ohne die Logik nachvollziehen zu können, kann auch niemand sagen was in dem Programm passiert, das dazu führt, dass Found auf True gesetzt wird.

Schönen Gruß aus dem kühleren Berlin!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Fr 25.07.14 13:27 
Zunächst einmal: Respekt, ich kann mir kaum vorstellen, dass ich selbst
a) das Alter überhaupt erreiche und
b) dann geistig noch so fit bin, mich mit Delphi herumzuschlagen :zustimm:
Zum Problem: vielleicht lässt es sich leichter lokalisieren, wenn Du innerhalb der Subroutine überhaupt nicht auf die Variable zugreifst, sondern aus der Prozedur eine Funktion machst. Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function Compare (Paar: integer): Boolean;
begin
  Result := false;
  if Bedingung then
    if AndereBedingung then
      Result := true;
end;

In der Hauptroutine weist Du deren Rückgabewert dann einfach der Variablen zu.
ausblenden Delphi-Quelltext
1:
Found := Compare(42);					

Steht dann in Found nicht das erwartete Ergebnis, dürfte der Fehler in der Subroutine liegen.
Zürrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: Sa 26.07.14 09:58 
Danke für Eure Anrworten.
Ich habe auch eine Antwort darauf geschrieben un gesendet, ist wohl nicht angekommen (mein Alter!)

Ich will einen grösseren Textteil meines Programms schicken, hier ist er;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Compare (Paar: integer);
    var
    b: integer;
    a,c,d,e,f,k:integer;
    z:integer;
  begin
    Found := false;
    if Paar = 0 then
      Exit;
    if Paar = 1 then
    begin
      Found := true;
      Zahl1 := StrToInt(Group2[1,1]);
      Zahl2 := StrToInt(Group2[1,2]);
      Zelle1x := StrToInt(Group1[1,1]);
      Zelle1y := StrToInt(Group1[1,2]);
      Zelle2x := StrToInt(Group1[1,3]);
      Zelle2y := StrToInt(Group1[1,4]);
    end;
    if Paar = 2 then
    begin   u.s.w.


das Ende von Compare enthält keinen Code nachdem Paar bei 9 angelangt ist

dieses Procedere Compare wird wie folgt aufgerufen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//,,,,,,        
      if Found1 = false then
          Dec(Paar);
      end;
      Compare(Paar);
      if Found = false then
      begin
        Auswertung1(j);
        if Found1 then
          Exit;
      end;    
    end;

Mein Problem besteht darin, dass ich nicht verstehe, wieso das Programm von selbst Found in vrai wandelt, wenn das Compare-Ende mit Paar = 0 verlassen wird.
Mir geht es darum, wieso das Programm so arbeitet. Es wäre ja ein Leichtes dieses Problem durch eine kleine Programmänderung zu beheben. Mir geht es ums Prinzip. Ist ein Fehler im Delphi-Compiler? (Soll ich Delphi2 nochmals laden? Ich habe das Original noch)
Danke für Euere Hilfe!
Zürrer

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Sa 26.07.14 11:57 
Ich hab den Quellcode jetzt nicht im Detail nachvollzogen. Aber es fällt auf, dass Du mal "found" schreibst und mal "found1". Ist das gewollt?


user profile iconZürrer hat folgendes geschrieben Zum zitierten Posting springen:

dieses Procedere Compare wird wie folgt aufgerufen:
,,,,,,
if Found1 = false then
Dec(Paar);
end;
Compare(Paar);
if Found = false then
begin
Auswertung1(j);
if Found1 then
Exit;
end;
end;


_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 26.07.14 12:37 
Ich denke das mit Found1 und Found geht schon in Ordnung, sonst macht die zweite Abfrage wenig Sinn.

user profile iconZürrer hat folgendes geschrieben Zum zitierten Posting springen:

Mein Problem besteht darin, dass ich nicht verstehe, wieso das Programm von selbst Found in vrai wandelt, wenn das Compare-Ende mit Paar = 0 verlassen wird.

Ich verstehe das Problem noch nicht so ganz. Wenn sich die Variable Found nicht wie gewollt verändert, könnte es daran liegen, dass in deinem Code mehrere Variablen mit diesem Namen existieren und die Prozeduren verschiedene benutzen. Probiere es mal so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function Compare (Paar: integer): boolean;
var
//...
begin
  Result:= false;
  if Paar = 0 then
    Exit;
  if Paar = 1 then
    begin
      Result:= true; 
      //...


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    if Found1 = false then
      Dec(Paar);
  end;
  Found := Compare(Paar); //hier wird garantiert, dass Found auch den entsprechenden Wert erhält
  if Found = false then
    begin
      Auswertung1(j);
      if Found1 then
        Exit;
    end;
end;


Was meinst du übrigens mit "in vrai gewandelt". Ist das Französisch?

PS:
Im ersten Posting schreibst du:

user profile iconZürrer hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1….. 
var 
,,,,,, 
Found: boolean;


Es scheint mir, dass Found als lokale Variable definiert ist. In diesem Fall kannst du nicht innerhalb der Compare-Funktion darauf zugreifen, was meinen Verdacht, dass du mehrere Variablen mit dem selben Namen in deinem Code hast, verstärkt.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
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: Sa 26.07.14 14:34 
Wenn du möchtest, kannst du auch das ganze Projekt als Anhang gepackt anhängen. Dann können wir direkt sagen was los ist.

Nebenbei:
Hier mein Sudoku-Löser, falls du einen Blick darauf werfen möchtest:
www.entwickler-ecke....Raetsel_48160,0.html
Zürrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: Sa 26.07.14 18:03 
Lieber Herr Jaenicke,
Danke für Ihre Mühe.
Ich habe Ihr Prgramm heruntergeladen und werde es sicher mit Interesse studieren. Hoffentlich ist mein Delphi2 kein Hindernis.
Ich werde Ihnen mein Programm gerne zur Verfügung stellen. Es ist aber auf einem anderen Programm aufgepropft, und zwar das Sudoku-Workpad, dessen Autor mir momentan nicht greifbar ist. Ich habe dieses Programm durch Lösungen für Naked Pairs und Hidden Pairs ergänzt, ich bin aber noch immer am letzten Schliff. Sobald ich fertig bin, werde ich es senden.
Für heute wünsche ich Ihnen einen schönen Abend und auf bald.
Zürrer
P.S.
vrai ist ein Fehler. Mit den vielen Sprachen kommt man häufig ins Durcheinander. Es muss natürlich true heissen.
Zürrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: So 27.07.14 12:07 
Hallo freundliche Kollegen.
Ich habe mich entschlossen, doch einen grösseren Abschnitt meines Programms in der Beilage zu senden. Die Verarbeitung des Sudokus hinsichtlich Hidden Pairs wird im Programm durch zwei Click-Zugänge ermöglicht, die durch Buttons aufgerufen werden. Falls ich auch ein geeignetes Sudoko senden muss, bitte anfordern, aber mit Angabe, wie es aussehen muss.
Ich wünschen allen einen guten Sonntag
Zürrer
Einloggen, um Attachments anzusehen!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 27.07.14 13:25 
Wie vermutet:
In Zeile 9 definierst du die Variable Found.
In Zeile 13 definierst du die Funktion Compare, welche die Variable aus Zeile 9 benutzt.
In Zeile 239 definierst du die Funktion SuchHor, welche auch die Variable aus Zeile 9 kennt.
In Zeile 242 definierst du nun die Variable Found nochmals. Damit "überschreibst" du die Variable aus Zeile 9 für die Funktion SuchHor (Scope!). Nun wird Found immer die Variable aus Zeile 242 bezeichnen, wenn du sie in der Funktion SuchHor benutzt.
In Zeile 295 rufst du dann die Funktion Compare auf. Diese arbeitet mit der Variablen aus Zeile 9, die einzige die sie kennt.
In Zeile 296 greifst du auf Found zu. Diese ist aber nicht die aus Zeile 9, sondern wird von der Variablen aus Zeile 242 verdeckt. Es ist also schlichtweg eine ganz andere Variable, die nur zufällig den selben Namen hat.

Zum Verständnis: Da beim Compilieren die Variable Found in der Funktion Compare eindeutig bekannt sein muss, kann sie nicht die (hierarchisch zur Aufrufzeit) nähere Variable aus Zeile 242 benutzen. Der Compiler verbindet die Compare-Funktion fest mit der Variablen aus Zeile 9. Benutze stattdessen eine Funktion mit einem boolschen Rückgabewert für Compare.
Das ist kein Fehler im Delphi-Compiler. Auch wenn mit einer gewissen Betrachtungsweise natürlich das Ergebnis falsch erscheint, aber das liegt an der "falschen" Betrachtungsweise ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
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 27.07.14 17:16 
Ein Tipp um solche Probleme zu vermeiden:
Derzeit sieht der Quelltext so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.bHiddenPairsHinClick(Sender: TObject);
var
  sc:^TSudokuCell;
  i,j,k,o,m,n,x,y,a,c,d,e,v: integer;
  ...

  procedure Compare (Paar: integer);
  begin
    ...
  end;

begin
  ...
end;
Besser ist es, wenn die eingebetteten Prozeduren oberhalb der Variablen definiert werden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.bHiddenPairsHinClick(Sender: TObject);

  procedure Compare (Paar: integer);
  begin
    ...
  end;

var
  sc:^TSudokuCell;
  i,j,k,o,m,n,x,y,a,c,d,e,v: integer;
  ...
begin
  ...
end;
Dann kann es gar nicht passieren, dass man Variablen verwendet, die aus der äußeren Prozedur kommen. Wenn man alle Variablen explizit übergibt und Rückgabewerte benutzt, ist der Abschnitt, in dem eine Variable vorkommt, auch nicht so groß, so dass man mehr Übersicht hat.

Und nebenbei kann man die Prozedur Compare auch mit sehr viel weniger Code schreiben:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
  procedure WriteValues(const AGroup1, AGroup2: Integer);
  begin
    Found := true;
    Zahl1 := StrToInt(Group2[AGroup1, 1]);
    Zahl2 := StrToInt(Group2[AGroup2, 1]);
    Zelle1x := StrToInt(Group1[AGroup1, 1]);
    Zelle1y := StrToInt(Group1[AGroup1, 2]);
    Zelle2x := StrToInt(Group1[AGroup1, 3]);
    Zelle2y := StrToInt(Group1[AGroup1, 4]);
  end;

  procedure Compare (Paar: integer);
    var
    b: integer;
    a,c,d,e,f,k:integer;
    z:integer;
  begin
    if Paar = 0 then
      Exit;
    Found := false;
    case Paar of
      1:
        WriteValues(11);
      2:
        if CompareStr(Group1[1], Group1[2]) = 0 then
          WriteValues(12);
      3:
        if CompareStr(Group1[1], Group1[2]) = 0 then
          WriteValues(12)
        else if CompareStr(Group1[1], Group1[3]) = 0 then
          WriteValues(13)
        else if CompareStr(Group1[2], Group1[3]) = 0 then
          WriteValues(23);
      4:
        if CompareStr(Group1[1], Group1[2]) = 0 then
          WriteValues(12)
        else if CompareStr(Group1[1], Group1[3]) = 0 then
          WriteValues(13)
        else if CompareStr(Group1[1], Group1[4]) = 0 then
          WriteValues(14)
        else if CompareStr(Group1[2], Group1[3]) = 0 then
          WriteValues(23)
        else if CompareStr(Group1[2], Group1[4]) = 0 then
          WriteValues(24)
        else if CompareStr(Group1[3], Group1[4]) = 0 then
          WriteValues(34);
    end;
  end;     { Compare }
Zürrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: Mo 28.07.14 17:12 
Ich weiss nicht, was ich falsch mache.
Ich habe mich gestern bedankt bei Euch für Eure Hilfe.
Offenbar ist dies nicht angekommen.
Also erneut vielen Dank für Eure Mühe.
Mein Alter spürt man an allen Enden!!!
Egon Zürrer Basel
Ich kann doch nichts zusätzlich machen, als unten "Absenden" drucken oder?
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: Mo 28.07.14 17:42 
Nein, mehr sollte nicht notwendig sein. Die eigene Antwort sollte danach aber auch angezeigt werden, ansonsten ist da ein Fehler aufgetreten.
Welcher Internet Browser ist das denn?
Zürrer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 27

WIN 7 Prof
Delphi 2
BeitragVerfasst: Di 29.07.14 11:12 
Ganz simpel: Firefox
An dem sollte es nicht liegen
Gruss
Zürrer
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 29.07.14 11:57 
Ich habe manchmal ein ähnliches Problem, wenn ich hinter einem Load Balancer sitze, der für mich bei nahezu jeder Aktion eine neue IP verwendet. Nach dem Drücken auf "Absenden" erscheint dann das Fenster zum Anmelden. In diesem Fall ist der Beitrag nicht angekommen.
Zum Glück kann man nicht mehr überall als Gast posten, sonst wären die Hälfte meiner Beiträge als Gast :P

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
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: Di 29.07.14 13:30 
Zum Glück unterstützen mittlerweile alle großen Browser (zuerst war das bei Chrome da, dann bei Firefox und am Ende auch beim IE) auch, dass man in dem Fall zurück drückt und den geschriebenen Text kopiert um ihn nicht nach der Anmeldung neu schreiben zu müssen.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Mo 23.03.15 22:59 
Ein Nachtrag:

Lieber Egon Zürrer,

ich fand Ihren Beitrag erfrischend und finde Ihre Aktivität bewundernswert.Spontan hatte ich jemandem einen Dreizeiler geschickt, der den Wert geistiger Aktivität besonders im Alter mehrfach in seinen Beiträgen im ZEIT Magazin betonte. Der "Jemand" ist ein populärer Schach-Großmeister... aber lesen Sie im Anhang (oder der gedruckten ZEIT) selbst, wie er Ihre Aktivität in seine Schach-Columne eingebaut hat....

Herzliche Grüße
GuaAck

An die Adminstratoren:
Sicher Off-Topic, aber wenn aus einem Forumsbeitrag eine Erwähnung in der ZEIT wird, wohl duldbar... vielleicht können Sie ihm ja auch eine E-Mail schicken, er ist wohl in den TOP 10 der Forumsmitglieder, wenn es nach dem Alter geht. Da wäre ein Exclusiv-Service schon möglich.
Einloggen, um Attachments anzusehen!