Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Array funktioniert nicht - Zugriffsverletzung (https://www.delphipraxis.net/12557-dynamisches-array-funktioniert-nicht-zugriffsverletzung.html)

Nonsense 29. Nov 2003 18:29


Dynamisches Array funktioniert nicht - Zugriffsverletzung
 
Hallo,
ich habe folgendes Array:
Delphi-Quellcode:
Field : array of array of TFieldType;
// TFieldType ist ein record
welches ich folgender Maßen füllen möchte:
Delphi-Quellcode:
  // [...]
  SetLength(Field, X - 1, Y - 1);
  // [...]
  for i := 0 to X - 1 do
  begin
    for j := 0 to Y - 1 do
    begin
      Field[j, i].Var := 1;
    end;
  end;
Der Compiler zeigt mir _keine_ Fehler an.
Nach dem Starten, bekomme ich aber eine Zugriffsverletzung. (Compiler springt auf "Field[j, i].Var := 1;").

Wenn ich jetzt aber z.B.:
Delphi-Quellcode:
Field : array[0..29, 0..29] of TFieldType;
schreibe, geht es.
Wie kann ich nun ein dynamisches, 2-dimensionales Array nutzen?


Danke im Voraus!
:)

Christian S. 29. Nov 2003 18:36

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Hallo!

Wenn Du SetLength(myArray, laenge) machst, dann ist der höchste Index, auf den Du noch zugreifen kannst laenge-1. Liegt daran, dass man bei Null anfängt, zu zählen.

Mfg
Peter

Niels 29. Nov 2003 18:50

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Bei SetLength musst du schon die wirkliche Länge angeben:

Delphi-Quellcode:
SetLength(Field, X, Y);
Das würde das selbe wie array[0..x-1,0..y-1] bedeuten.

Außerdem gibts bei dir ne Zugriffsverletzung wenn x <> y, wegen der Zuweißung
Delphi-Quellcode:
Feld[j,i] := 1;
Du musst entweder
Delphi-Quellcode:
Feld[i,j] := 1;
schreiben

oder du musst die Schleifen abändern in

Delphi-Quellcode:
for i := 0 to Y - 1 do
  begin
    for j := 0 to X - 1 do
    begin
      Field[j, i].Var := 1;
    end;
  end;
Du hast natürlich auch noch die Möglichkeit:
Delphi-Quellcode:
SetLength(Field, Y, X);

MfG Niels

Nonsense 29. Nov 2003 19:10

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Danke für eure Mühe, aber es hatte nichts geholfen. :cry:

Zu X und Y:
Beides sind Werte von 1 bis ...
Deshalb das "X - 1", bzw "Y - 1", da dass Array ja bei 0 anfängt zu zählen.

CalganX 29. Nov 2003 19:18

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Hi,
hast du die erste Antwort von Peter nicht gelesen? :shock:

Wenn, dann musst du schreiben
Delphi-Quellcode:
for i:=0 to Y-2 do
Das gleiche für j. Sonst greifst du auf eine Stelle im Speicher zu, die gar nicht zum Array gehört. Dann KANN es nur zu einer AV kommen.

Chris

Nonsense 29. Nov 2003 19:24

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
@Chakotay1308: Das kann aber nicht hinhauen.
Die letzten Einträge bleiben dann leer (wegen "X - 2" und "Y - 2), soll heißen, ich bekomme eine Zugriffverletzung, da die Werte im Array nicht belegt sind.

Nonsense 29. Nov 2003 19:28

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Ich habs...*GD&R*...
Es lag am SetLength, richtig ist jetzt:
Delphi-Quellcode:
  SetLength(Field, X, Y);

[...]

  for i := 0 to Y - 1 do
  begin
    for j := 0 to X - 1 do
    begin
      Field[j, i].Var := 1;
    end;
  end;
Danke @all!

CalganX 29. Nov 2003 19:29

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Hi,
das hat doch "Niels" gemeint. ;)

Chris

Nonsense 29. Nov 2003 19:32

Re: Dynamisches Array funktioniert nicht - Zugriffsverletzun
 
Ja, mein Hirn läuft noch mechanisch, da dauert das ein wenig, bis die Logik sich ausbreiten kann... :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.

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