| 
| Autor | Beitrag |  
| Zürrer 
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: Fr 25.07.14 11: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. 
 		                       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  Narses: Delphi-Tags hinzugefügt |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 25.07.14 12: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 
          Beiträge: 653
 Erhaltene Danke: 160
 
 
 
 
 | 
Verfasst: Fr 25.07.14 12: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     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:
 		                       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.
 		                       Delphi-Quelltext 
 Steht dann in Found nicht das erwartete Ergebnis, dürfte der Fehler in der Subroutine liegen. |  |  |  
| Zürrer  
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: Sa 26.07.14 08: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;
 		                       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:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 
 |       if Found1 = false thenDec(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  Narses: Delphi-Tags hinzugefügt |  |  |  
| Nersgatt 
          Beiträge: 1581
 Erhaltene Danke: 279
 
 
 Delphi 10 Seattle Prof.
 
 | 
Verfasst: Sa 26.07.14 10: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?
 	  |  Zürrer hat folgendes geschrieben  : |  	  | 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 
          
  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)
 
 | 
Verfasst: Sa 26.07.14 11:37 
 
Ich denke das mit Found1 und Found geht schon in Ordnung, sonst macht die zweite Abfrage wenig Sinn.
 	  |  Zürrer hat folgendes geschrieben  : |  	  | 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:
 		                       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;
 
 |  		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 
 |     if Found1 = false thenDec(Paar);
 end;
 Found := Compare(Paar);   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:
 	  |  Zürrer hat folgendes geschrieben  : |  	  | 		                       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 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Sa 26.07.14 13: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  
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: Sa 26.07.14 17: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  
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: So 27.07.14 11: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 
          
  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)
 
 | 
Verfasst: So 27.07.14 12: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 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: So 27.07.14 16:16 
 
Ein Tipp um solche Probleme zu vermeiden:
 Derzeit sieht der Quelltext so aus: 		                       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: 		                       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: 												| 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(1, 1);
 2:
 if CompareStr(Group1[1], Group1[2]) = 0 then
 WriteValues(1, 2);
 3:
 if CompareStr(Group1[1], Group1[2]) = 0 then
 WriteValues(1, 2)
 else if CompareStr(Group1[1], Group1[3]) = 0 then
 WriteValues(1, 3)
 else if CompareStr(Group1[2], Group1[3]) = 0 then
 WriteValues(2, 3);
 4:
 if CompareStr(Group1[1], Group1[2]) = 0 then
 WriteValues(1, 2)
 else if CompareStr(Group1[1], Group1[3]) = 0 then
 WriteValues(1, 3)
 else if CompareStr(Group1[1], Group1[4]) = 0 then
 WriteValues(1, 4)
 else if CompareStr(Group1[2], Group1[3]) = 0 then
 WriteValues(2, 3)
 else if CompareStr(Group1[2], Group1[4]) = 0 then
 WriteValues(2, 4)
 else if CompareStr(Group1[3], Group1[4]) = 0 then
 WriteValues(3, 4);
 end;
 end;
 |  |  |  |  
| Zürrer  
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: Mo 28.07.14 16: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 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mo 28.07.14 16: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  
          Beiträge: 27
 
 WIN 7 Prof
 Delphi 2
 
 | 
Verfasst: Di 29.07.14 10:12 
 
Ganz simpel: Firefox
An dem sollte es nicht liegen
 Gruss
 Zürrer
 |  |  |  
| Xion 
          
  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)
 
 | 
Verfasst: Di 29.07.14 10: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  _________________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 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 29.07.14 12: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 
          Beiträge: 378
 Erhaltene Danke: 32
 
 Windows 8.1
 Delphi 10.4 Comm. Edition
 
 | 
Verfasst: Mo 23.03.15 21: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!
 |  |  |  |