Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zeiger auf dynamisches Array (https://www.delphipraxis.net/155601-zeiger-auf-dynamisches-array.html)

Gargamel 31. Okt 2010 12:31

Delphi-Version: 2006

Zeiger auf dynamisches Array
 
Hallo alle zusammen.

Ich zeige Euch erstmal den Quellcode:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TArrayList = array of array of integer;
  PArrayList = ^TArrayList;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure modifyMatrix(list:PArrayList);
Begin
  list^[2,4]:=5;
end;

procedure TForm1.Button1Click(Sender: TObject);
var mylist:PArrayList;
begin
  new(mylist);
  setLength(myList^,4,4);
  mylist^[0,5]:=3;
  modifyMatrix(myList);

  label1.Caption:=inttostr(mylist^[0,5]);
  label2.Caption:=inttostr(mylist^[2,4]);
  //dispose(mylist);
end;
Jetzt hätte ich dazu zwei Fragen:

1. Mit setLength lege ich die Größe des dynamischen Arrays fest. Warum kann ich über dessen Grenzen hinaus trotzdem Werte ablegen?

2. Die kommentierte Zeile "dispose(mylist);" erzeugt einen Absturz. Warum?


Danke

himitsu 31. Okt 2010 13:19

AW: Zeiger auf dynamisches Array
 
Zitat:

Zitat von Gargamel (Beitrag 1058718)
Warum kann ich über dessen Grenzen hinaus trotzdem Werte ablegen?

Schalte mal die Index- und Bereichsprüfung in den Projektoptionen an.
Oder setze die entsprechenden Compilerschalter.

Zitat:

Zitat von Gargamel (Beitrag 1058718)
2. Die kommentierte Zeile "dispose(mylist);" erzeugt einen Absturz. Warum?

Auch so?
Delphi-Quellcode:
new(mylist);
setLength(myList^,4,4);

dispose(mylist);
Wenn nicht, dann stück für Stück die restlichen Zeilen einfügen und schauen wann's knallt.


Und die Frage: Warum muß es unbedingt ein Pointer sein?
Eventuell läßt es sich ja anders lösen.

Bummi 31. Okt 2010 13:30

AW: Zeiger auf dynamisches Array
 
Schalte die Bereichsüberprüfung ein...
und warum greift Du über Zeiger zu, so geht es auch
Delphi-Quellcode:
procedure modifyMatrix(list:TArrayList);
Begin
  list[2,4]:=5;
end;


procedure TForm1.Button1Click(Sender: TObject);
var mylist:TArrayList;
begin

  setLength(myList,6,6);
  mylist[0,5]:=3;
  modifyMatrix(myList);

  label1.Caption:=inttostr(mylist[0,5]);
  label2.Caption:=inttostr(mylist[2,4]);

end;

Gargamel 31. Okt 2010 13:51

AW: Zeiger auf dynamisches Array
 
Danke für die Antworten. Der Hinweis mit der Bereichsüberprüfung war sehr gut. Das hat es gebracht.
Ohne die Bereichsüberprüfung kam die Fehlermeldung "Ungültige Zeigeroperation", wenn ich dispose(mylist) ausführen und auf einen höheren Index zugreifen wollte, den es laut selLength garnicht gibt.

Und zu der Frage, warum ich gerade diesen Ablauf wollte: Ziel ist es, daß ich eine lokale Variable (in diesem Fall ein zweidimensionales Array) durch eine andere Funktion ändern lassen kann.

himitsu 31. Okt 2010 15:12

AW: Zeiger auf dynamisches Array
 
Zitat:

Zitat von Gargamel (Beitrag 1058730)
Ziel ist es, daß ich eine lokale Variable (in diesem Fall ein zweidimensionales Array) durch eine andere Funktion ändern lassen kann.

Var-Parameter?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr.

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