Autor Beitrag
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Do 06.10.05 18:38 
Hallo
Hat einer eine Ahnung warum folgender Code ein EAccessViolation in der zweiten Zeile auslöst?
ausblenden Delphi-Quelltext
1:
2:
  FillChar(Matrix, SizeOf(Matrix), Ord(' '));
  Matrix[20,1] := '5';

Wenn ich FillChar... auskommentiere Funktioniert es.
Das ergibt für mich keinen Sinn. :?
SMO
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 120
Erhaltene Danke: 18


D2005 Personal
BeitragVerfasst: Do 06.10.05 19:46 
Wäre hilfreich, wenn du auch schreiben würdest, wie "Matrix" definiert ist.
Falls es ein dynamisches Array ist, dann ist es kein Wunder, dass es zu einer Zugriffsverletzung kommt. Die Art, auf die du hier FillChar benutzt, funktioniert nur bei statischen Arrays.
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Do 06.10.05 20:00 
Ubs sorry!
ausblenden Delphi-Quelltext
1:
var  Matrix: Array[1..20,1..20of String;					

Der Fehler kommt nicht beim FillChar sondern erst in der zweiten Zeile bzw. erst wenn ich etwas anderes hineinschreibe.
Wenn ich vorher aber kein FillChar mache funktioniert das reinschreiben.
Muss es also doch am FillChar liegen... :gruebel:
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 06.10.05 20:28 
Das Delphi bei der Zeile darunter anhält ist ja auch logisch. Denn der Pfeil, ist auch bei Haltepunkten und so, zeigt dir nur, welche Befehlszeile als nächstes drankommt. Da stört ihm auch keine Fehlermeldung. Wenn er dir also einen Fehler ausspuckt und dich auf eine Zeile verweise, ist es normalerweise immer die Zeile davor.
SMO
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 120
Erhaltene Danke: 18


D2005 Personal
BeitragVerfasst: Do 06.10.05 20:29 
user profile iconCoder hat folgendes geschrieben:
Muss es also doch am FillChar liegen... :gruebel:

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:
ausblenden 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] := ' ';
// oder besser, da allgemeiner:
  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:
ausblenden Delphi-Quelltext
1:
Finalize(Matrix);					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 06.10.05 20:31 
Schätze mal, dass er mit dem String und dem Speichergedöns damit durcheinander kommt.

//edit: Wenn man zwischendurch telefoniert, ist man einfach zu langsam ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".


Zuletzt bearbeitet von Christian S. am Do 06.10.05 20:33, insgesamt 1-mal bearbeitet
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Do 06.10.05 20:31 
Schau mal,
initialisiere dein Array mit #0 und nicht mit Leerzeichen (#32) dann klappts auch. Schau dir dazu mal die Definitionen von Strings an. Imho gibts da ein Längenbyte[0] bei Shortstrings, welches du mit #32 überschreibst. Kein Wunder, das da die RTL meckert. Bei Langen Strings wirds noch komplizierter.

warum nicht so:
ausblenden Delphi-Quelltext
1:
2:
const EmptyString='';
for I:=1 to 20 do for Y:=1 to 20 do Matrix[I,Y]:=EmptyString;

so umgehst du alle Fallstricke.

grez
msch//Edit: war etwas langsam

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Do 06.10.05 20:38 
Dankeschön! :D
Nehme jetzt die Lösung von SMO und MSCH.
:wave: