AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AV bei array größer 2000

Offene Frage von "jaschu"
Ein Thema von jaschu · begonnen am 28. Sep 2005 · letzter Beitrag vom 30. Sep 2005
Antwort Antwort
jaschu

Registriert seit: 21. Mär 2005
38 Beiträge
 
#1

Re: Eigene Klasse

  Alt 28. Sep 2005, 15:15
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;
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Eigene Klasse

  Alt 28. Sep 2005, 15:28
Was genau ist TDSatz? Ein Record? Eine Klasse? Das wäre recht interessant.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Eigene Klasse

  Alt 28. Sep 2005, 15:30
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
Christian
  Mit Zitat antworten Zitat
jaschu

Registriert seit: 21. Mär 2005
38 Beiträge
 
#4

Re: Eigene Klasse

  Alt 28. Sep 2005, 15:40
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;
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#5

Re: Eigene Klasse

  Alt 28. Sep 2005, 18:09
Zitat von jaschu:
Okay, nächste Frage:
Neue Frage - neuer Thread!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: AV bei array größer 2000

  Alt 28. Sep 2005, 19:03
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
  Mit Zitat antworten Zitat
jaschu

Registriert seit: 21. Mär 2005
38 Beiträge
 
#7

Re: AV bei array größer 2000

  Alt 28. Sep 2005, 20:06
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) = '.mp3then
           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.
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#8

Re: AV bei array größer 2000

  Alt 28. Sep 2005, 22:15
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
  Mit Zitat antworten Zitat
jaschu

Registriert seit: 21. Mär 2005
38 Beiträge
 
#9

Re: AV bei array größer 2000

  Alt 29. Sep 2005, 08:21
Ja, das hatte ich vergessen - es löst nur leider net mein Problem =/

Trotzdem danke für den Hinweis
  Mit Zitat antworten Zitat
jaschu

Registriert seit: 21. Mär 2005
38 Beiträge
 
#10

Re: AV bei array größer 2000

  Alt 30. Sep 2005, 14:47
Weiß keiner weiter? =/
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 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