Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AV bei dynamischen Array (https://www.delphipraxis.net/54256-av-bei-dynamischen-array.html)

jaschu 30. Sep 2005 17:41


AV bei dynamischen Array
 
So, habe mal mein Problem von 2 Threads weiter unten stark vereinfacht.
Bei Hinzufügen eines Strings tritt eine Zugriffsverletzung auf, wenn man das Programm schließt.

Delphi-Quellcode:

unit tmp3list;

interface

type
  dsatz = record
            t0 : String[200];
            t1, t2 : Integer;
          end;
  mp3list = class
              private
                items : array of Dsatz;
                function getcount : Integer;
              public
                property count: Integer read GetCount;
                procedure addsingle(str : String);
                procedure readsingle(pos : Integer; var str : String);
                procedure new;
             end;
implementation


function mp3list.getcount : Integer;
begin
  result := length ( items );
end;

procedure mp3list.addsingle(str : String);
begin
  setlength(items, length(items)+1);
  items[length(items)].t0 := str;
end;

procedure mp3list.readsingle(pos : Integer; var str : String);
begin
  str := items[pos].t0;
end;

procedure mp3list.new;
begin
  setlength(items, 0);
end;
end.
Aufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var test : mp3list;
begin
  test.Create;
  test.new;
  test.addsingle('bla');
  showmessage(inttostr(test.count));
end;
Projekt: Klick

Weiß jetzt hier jemand Rat?

Danke schonmal und nen schönen Abend noch!

Jaschu

marabu 30. Sep 2005 18:21

Re: AV bei dynamischen Array
 
Hi Jaschu,

Zitat:

Zitat von jaschu
Bei Hinzufügen eines Strings tritt eine Zugriffsverletzung auf, wenn man das Programm schließt.

das ist die Fehlerklasse "off-by-one" - mach das besser so:

Delphi-Quellcode:
procedure mp3list.addsingle(str : String);
begin
  setlength(items, length(items)+1);
  items[High(items)].t0 := str;
end;
Grüße vom marabu

teebee 30. Sep 2005 18:47

Re: AV bei dynamischen Array
 
Zwei Dinge sind mir aufgefallen:

1) Es ist besser, eigenen Datentypen im Quelltext ein T voranszustellen. Das ist eine sinnvolle Konvention, die den Quelltext leichter lesbar macht.

2) Du möchtest ein Objekt der Klasse mp3list erzeugen, das geht so:
Delphi-Quellcode:
test := mp3list.Create;
Gruß, teebee

EDIT: Achja, ein drittes noch: Du solltest test auch wieder freigeben, sonst ensteht ein Speicherleck.
Ist zwar wohl nur experimenteller Code, aber egal...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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