Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   AV bei array größer 2000 (https://www.delphipraxis.net/54139-av-bei-array-groesser-2000-a.html)

jaschu 28. Sep 2005 14:15


Re: Eigene Klasse
 
Okay, nächste Frage:

Wenn ich das Array größer als 2000 Felder mache, dann bekomme ich sofort eine Zugriffsverletzung.

Wenn ich unter 2000 Feldern bleibe, bekomme ich eine Zugriffsverletzung beim Schließen. WTF!?

Delphi-Quellcode:
  procedure Tmp3list.newdirlist(pfad : String);
  var fertigtemp : TStringlist; x : Integer;
  begin
      x := 0 ;
      fertigtemp := TStringlist.Create;

      { ... Befüllen der fertigtemp }

      setlength(items, fertigtemp.count);
      for x := 0 to fertigtemp.count-1 do
      begin
        items[x].pfad := fertigtemp.Strings[x];
        items[x].listid := pfad;
      end;

leddl 28. Sep 2005 14:28

Re: Eigene Klasse
 
Was genau ist TDSatz? Ein Record? Eine Klasse? Das wäre recht interessant.

Kedariodakon 28. Sep 2005 14:30

Re: Eigene Klasse
 
Für 2000+ Einträge empfehele ich dir eine ObjectList bzw. ne Collection...

Zu deinem Problem, zeig mal den Constructor und den Destructor von deiner Klasse...
wo gibtst du den Speicher wieder frei bzw. reservierst ihn???

Bye

jaschu 28. Sep 2005 14:40

Re: Eigene Klasse
 
hm, quasi gar nicht, arbeite das erste mal mit Klassen & dyn. Arrays

Delphi-Quellcode:
type
  TDsatz = RECORD
               id, playcount : Integer;
               pfad: String[255];
               Interpret, songname, listid : String[80];
             END;


  Tmp3list = class
    private
      items: Array of TDsatz;
      function GetCount: Integer;
    public
      procedure newdirlist(pfad : String);
      procedure addlist(neu : Tmp3list);
      procedure listdircontent(Verzeichnis :string; var listenname:TStringlist);
      property count: Integer read GetCount;
    end;

r_kerber 28. Sep 2005 17:09

Re: Eigene Klasse
 
Zitat:

Zitat von jaschu
Okay, nächste Frage:

Neue Frage - neuer Thread!

marabu 28. Sep 2005 18:03

Re: AV bei array größer 2000
 
Hi jaschu,

auch wenn der von dir gezeigte Code etwas unorthodox ist - den von dir beschriebenen Fehler kann er eigentlich nicht auslösen. Nur mal ein Gedankenspiel: dein record hat eine Größe von 508 Bytes. Bei 2000 Einträgen im array schrammst du am upper stack limit von 1 MB vorbei. Vielleicht machst du ja irgendwo schlimme Sachen und wir sehen es nicht?

Grüße vom marabu

jaschu 28. Sep 2005 19:06

Re: AV bei array größer 2000
 
Hm, hier mal die komplette Unit:

Delphi-Quellcode:
unit USource;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDsatz = RECORD
               id, playcount : Integer;
               pfad: String[255];
               Interpret, songname, listid : String[80];
             END;


  Tmp3list = class
    private
      items: Array of TDsatz;
      function GetCount: Integer;
    public
      procedure newdirlist(pfad : String);
      procedure addlist(neu : Tmp3list);
      procedure listdircontent(Verzeichnis :string; var listenname:TStringlist);
      property count: Integer read GetCount;
    end;


  var usertime, guesstime, maxpoints : Integer; sollid3tag : Boolean; kompletteliste : tmp3list;
  implementation



  procedure Tmp3list.newdirlist(pfad : String);
  var liste,tempdirlist, fertigtemp : TStringlist; akt : String; x : Integer;
  begin
      x := 0 ;
      fertigtemp := TStringlist.Create;
      liste := TStringlist.Create;
      listdircontent(pfad, liste);
      while liste.Count > 0 do
      begin
         akt := liste.strings[x];
         if extractfileext(akt) = '.mp3' then
           fertigtemp.Add(akt)
         else
         if directoryexists(akt) then
         begin
           tempdirlist := TStringlist.Create;
           listdircontent(akt, tempdirlist);
           liste.AddStrings(tempdirlist);
         end;
         liste.delete(x);
      end;
      setlength(items, fertigtemp.count);
      for x := 0 to fertigtemp.count-1 do
      begin
        items[x].pfad := fertigtemp.Strings[x];
        items[x].listid := pfad;
      end;
  end;


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


  procedure Tmp3list.listdircontent(Verzeichnis :string; var listenname:TStringlist);
  var SR: TSearchRec;
  begin
    if Verzeichnis[length(Verzeichnis)]<>'\' then
      Verzeichnis:=Verzeichnis+'\';
    if FindFirst(Verzeichnis+'*.*',$3F,SR)=0 then begin
      repeat
        if (SR.Name<>'.') and (SR.Name<>'..') then
          listenname.Add(Verzeichnis+SR.Name);
      until FindNext(SR)<>0;
      FindClose(SR);
    end;
  end;


  procedure tmp3list.addlist(neu : Tmp3list);
  var tmp, tmp2,x : Integer;
  begin
    x := 0;
    tmp := getcount;
    tmp2 := neu.count;
    setlength(items, tmp + tmp2);
    for tmp := tmp to tmp + tmp2 do
    begin
      items[tmp] := neu.items[x];
      inc(x);
    end;
  end;

end.

Christian18 28. Sep 2005 21:15

Re: AV bei array größer 2000
 
Hallo,

nur mal so als kleiner Tip. Wenn du ein Objekt erzeugst, dann solltest du es auch wieder freigeben, wenn du es nicht mehr brauchst. Hab ich bei deinen StringListen gesehen die Du zum Beispiel erzeugst.

Mit freundlichen Grüßen

Christian18

jaschu 29. Sep 2005 07:21

Re: AV bei array größer 2000
 
Ja, das hatte ich vergessen - es löst nur leider net mein Problem =/

Trotzdem danke für den Hinweis :zwinker:

jaschu 30. Sep 2005 13:47

Re: AV bei array größer 2000
 
Weiß keiner weiter? =/


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