Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mein Sudoku Programm friert ein, komme nicht weiter (https://www.delphipraxis.net/93035-mein-sudoku-programm-friert-ein-komme-nicht-weiter.html)

qb-tim 30. Mai 2007 15:33


Mein Sudoku Programm friert ein, komme nicht weiter
 
Hi,

die folgende Prozedur soll aus s ein Sudoku machen. Folgendes ist vorab zu erwähnen:

=> ResetSudoku ist eine Prozedur, die das Programm zurücksetzt
=> c ist ein CHAR
=> x, y, i, j sind INTEGERs
=> s ist ein String
=> Edit[x, y] ist ein modifizierter TEdit (weitere PROPERTY "Sollution" (=Lösung) hinzugefügt)

Das Programm startet mit Form1 ohne Fehlermeldung. Sobald ich aber die Prozedur auslöse friert das Programm!
Die Decodierung sollte so funktionieren:

1. ASCII-Wert lesen
2. ASCII-Wert - 100 = ab
3. Trenne beide Ziffern
4. Setzte Ziffern in Edit[x, y] ein

:arrow: Jedes ASCII-Zeichen steht für zwei Zahlen!

Delphi-Quellcode:
procedure TForm2.SetSudoku(s: String);
begin
  ResetSudoku;
  for i := 1 to 40 do
  begin
    c := s[i];
    y := Ord( c ) - 100;
    x := Round( Int( y / 10 ) );
    y := y - ( x * 10 );
    j := i * 2 - 1;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Text := IntToStr(x);
    j := i * 2;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Text := IntToStr(y);
  end;
  i := 41;
  c := s[i];
  y := Ord( c ) - 100;
  x := Round( Int( y / 10 ));
  y := y - ( x * 10 );
  j := i * 2 - 1;
  Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Text := IntToStr(x);
  for i := 42 to 81 do
  begin
    c := s[i];
    y := Ord( c ) - 100;
    x := Round( Int( y / 10 ) );
    y := y - ( x * 10 );
    j := i * 2 - 1;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Sollution := IntToStr(x);
    j := i * 2;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Sollution := IntToStr(y);
  end;
  i := 82;
  c := s[i];
  y := Ord( c ) - 100;
  x := Round( Int( y / 10 ));
  y := y - ( x * 10 );
  j := i * 2 - 1;
  Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Sollution := IntToStr(x);
  SollutionAvailable := True;
end;

Klaus01 30. Mai 2007 15:45

Re: BUG => Ich komme nicht weiter
 
Hast Du bei begin schon 'mal einen Breakpoint/Haltepunkt gesetzt und bis mit
F8 durch die Procedure gelaufen.
Dann sollltest Du sehen, wo es denn hängt.

Grüße
Klaus

fkerber 30. Mai 2007 16:24

Re: BUG => Ich komme nicht weiter
 
Hi!

Könntest du dem Thread bitte noch einen Titel verpassen, unter dem man sich eher vorstellen kann, um was es geht?
Das wäre prima - danke!


Ciao, Frederic

qb-tim 31. Mai 2007 11:46

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
OK.. Titel geändert...

@ Klaus08: :wiejetzt:

Klaus01 31. Mai 2007 15:34

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von qb-tim
OK.. Titel geändert...

@ Klaus08: :wiejetzt:

Also du gehst mit dem Cursor in diese Zeile

Delphi-Quellcode:
procedure TForm2.SetSudoku(s: String);
begin                //<-- hier Breakpoint setzten (siehe Bild)
  ResetSudoku
;


Dann drückst Du F9, Dein Programm wird gestartet und hält wenn die Methode aufgerufen wird.
Dann kannst Du mit F7 oder F8 in dem Quelltext das Programm schrittweise weiterlaufen lassen.
Du solltest dann eigentlich sehen, wo das Programm hängt, wenn es in dieser Methode hängen sollte.

Grüße
Klaus

qb-tim 31. Mai 2007 16:34

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
OK.. Ich probiere das gleich aus :angel:

qb-tim 31. Mai 2007 16:45

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
OK! Ich habe mir die "ASCII-Werte" angesehen (c) und gesehen das irgendwelche komischen zeichen (vielleicht hexidecimal) aber auf jeden Fall keine Unicode ASCII-Werte widergegeben werden!

Daraus folgt die Frage: Wie lese ich aus einem String die ASCII-Werte (Unicode) in Form von Integers aus?

Was müsste ich am folgenden Codeabschnitt dafür ändern bzw hinzufügen...

Delphi-Quellcode:
for i := 1 to 40 do
  begin
    c := s[i];
    y := Ord( c ) - 100;
    x := Round( Int( y / 10 ) );
    y := y - ( x * 10 );
    j := i * 2 - 1;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Text := IntToStr(x);
    j := i * 2;
    Edit[Round( j - ( 9 * Int( j / 9 ) ) ), Round( Int( j / 9 ) )].Text := IntToStr(y);
  end;

qb-tim 2. Jun 2007 09:17

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
Bitte zum Thema "ASCII" in diesem ( http://www.delphipraxis.net/internal...=730332#730332 ) Thread posten...

"Neue Frage = Neues Thema"

Phoenix 2. Jun 2007 11:45

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
Zitat:

Zitat von qb-tim
Daraus folgt die Frage: Wie lese ich aus einem String die ASCII-Werte (Unicode) in Form von Integers aus?

:wiejetzt:

ASCII ist immer ungleich Unicode!
Entweder, eine Datei ist ASCII-Kodiert, ODER sie ist Unicode (UTF)-Kodiert, aber das eine schliesst das andere schon prinzipbedingt aus.

Per Zufall (oder eher historisch gewachsen), sind die ersten 128 UTF-Zeichen mit denen die im ASCII-Standard definiert sind identisch, aber ASCII ist eine 7-Bit Codierung und UTF mindestens mal eine 8-Bit, wenn nicht sogar 16-Bit oder noch breitere Codierung, je nach Version.

DGL-luke 2. Jun 2007 12:48

Re: Mein Sudoku Programm friert ein, komme nicht weiter
 
lange rede kurzer sinn, dann muss man den unicdoe-string halt in einen ASCII-String gemäß der am besten passenden/aktiven Codepage umwandeln.

oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz