Coder hat folgendes geschrieben: |
Muss es also doch am FillChar liegen...  |
Habe ich ja nicht bestritten, oder?
Ok, Matrix ist ein statisches Array, damit könntest du FillChar so wie du es tust benutzen - wenn die Elemente keine Strings wären! Das String-System von Delphi hat ein paar Eigenheiten, die man kennen sollte. Ich empfehle dir mal das
String-Tutorial von Motzi.
Strings sind implizite Pointer, also Zeiger auf variable Speicherbereiche (schließlich können Strings variabel lang sein). Mit deinem FillChar Aufruf überschreibst du nicht die Inhalte der Strings, sondern ebendiese Zeiger. Daher greift die folgende Anweisung auf eine ungültige Speicheradresse zu und verursacht eine Zugriffsverletzung.
FillChar kannst du also hier nicht so einsetzen. Erstens ist es generell gefährlich Stringvariablen per Move oder FillChar zu manipulieren, weil man so ziemlich leicht Speicherlecks oder andere Fehler verursachen kann, wenn man nicht genau weiß, was man tut. Zweitens ist eine Matrix aus Strings nicht gerade effizient. Warum benutzt du nicht Integer oder Double für die Matrixelemente? Zur Anzeige können die Werte dann immer noch in Strings konvertiert werden.
Falls es unbedingt Strings sein müssen, geht es nur per Schleife:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var x, y: Integer; for y := 1 to 20 do for x := 1 to 20 do Matrix[y, x] := ' '; for y := Low(Matrix) to High(Matrix) do for x := Low(Matrix[y]) to High(Matrix[y]) do Matrix[y, x] := ' '; |
Wenn die Matrix "gelöscht" werden soll, d.h. alle String-Elemente auf '' (leerer String) gesetzt werden sollen, gibt es zusätzlich noch diese Möglichkeit:
Delphi-Quelltext