AGB  ·  Datenschutz  ·  Impressum  







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

Brauche Array und Record Alternative

Ein Thema von Brainstalker · begonnen am 15. Okt 2004 · letzter Beitrag vom 15. Okt 2004
Antwort Antwort
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#1

Brauche Array und Record Alternative

  Alt 15. Okt 2004, 03:40
Hi Leute!

Ich benutze in meiner Anwendung ein Record und ein dynamisches Array von diesem Record.
Delphi-Quellcode:
TMeinRecord = record
  MeineVar: integer;
  .
  .
  .
end;

MeinArray: Array of TMeinRecord;
Bis dahin kein Problem, ich kann auch das Array füllen. Keine Fehler alles geht wunderbar.
Wenn ich jetzt allerdings mal schnell eben 2000 Arrays erstellen will, kommt Fehler zu wenig Arbeitsspeicher. Kann ich natürlich verstehen, dass der Arbeitsspeicher keine Lust mehr hat.

Ich lese in ein TListView Dateinamen ein, wie gesagt können in Ausnahmefällen locker 2000 oder mehr sein. Das Listview spielt mit und hat kein Problem, aber ich will zu jedem eingelesenen Dateinamen noch mindestens drei weitere Werte zuweisen, diese sollen allerdings nicht im ListView stehen.

Ein zweites Problem das sich daraus ergibt, ist das speichern dieses Arrays. Wenn das Array(Leer, keine Werte) eine Länge von 2000 hat und gespeichert wird, erreich ich eine größe von über 30 MB.

Gibt es da einen Besseren Weg als mit Arrays und Records zu arbeiten? Es ist aber auf jeden Fall möglich diese Größe von Daten "speicherschonend" zu speichern und im Program zu benutzen.

Würde mich über Tipps sehr freuen.
Michael N.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 07:19
Es ist nicht ratsam, immer die gleiche Menge Speicher zu alloziieren, wenn nicht alles davon gebraucht wird. Die Listview verfährt genauso: Sie holt sich den Speicher, wie sie ihn braucht. Das würde ich dir auch vorschlagen: Nimm dir nur dann Speicher für das Array, wenn du ihn auch wirklich brauchst.
  Mit Zitat antworten Zitat
michael.kaufmann

Registriert seit: 5. Okt 2004
Ort: Liechtenstein
9 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 14:27
Ja die lieben record,

30Mb ist aber sehr sehr viel wenn du es dynamisch verwaltest.
ich verwende arrays nur wenn es unbedingt notwendig
und wann ist es notwendig war nur ein spass siehe dir die TList an ist ein wenig flexibler und hat da mehr an
flexibilät außer du schreibst gerne

mfg
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 14:36
Ah ich merke gerade das ich mich ein bisschen falsch ausgedrückt hatte. Ich will nicht 2000 Arrays erstellen sondern ein array, also beispielsweise: MeinArray: Array[0..2000] of TMeinRecord; Aber wenn ich das Speicher Problem gelöst habe, steh ich immer noch vor dem Problem mit dem abspeichern der Daten. Weil es dabei zu sehr großen Dateien von mehr al 30 MB führt.
Aber trotzdem vielen Dank für deinen Tipp.


TList werd ich mir auf jeden Fall mal ansehen, weil ich das mit dem Array lasse, da gibts sicher keine Möglichkeit für meine Anwendung. Noch eine andere Frage, kann ich Records in verbindung mit einer TListView benutzen? Also jeder Zeile ein Record zuweisen? Oder wäre das genauso Speicherlastig?
Michael N.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 14:39
Erstelle ein dynamsiches Array in der Form [/b]array of[b] TMeinRecord und setzte die Länge später mit Delphi-Referenz durchsuchenSetLength().
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 14:42
Ja ich mach das ja auch mit SetLength. Das ist auch alles kein Problem, nur wenn die Länge eine bestimmte Größe übertrifft will er nicht mehr. Ich möchte aber das mein Programm damit fertig wird.
Michael N.
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 17:39
Also ich hab mein Problem jetzt anders gelöst. Ich benutze ein TListView in denen ich alle Werte speicher, aber ich zeig halt nur die ersten beiden Werte an. Damit wäre mein Problem gelöst. Ich bedanke mich bei euch beiden. Eine andere Lösung wäre die mit TList, aber für mich ist das mit dem TListView einfacher. CLOSED
Michael N.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Brauche Array und Record Alternative

  Alt 15. Okt 2004, 17:51
das ganze ist ganz einfach zu erklären. Bei einem Array werden alle Werte des Arrays hintereinander im Speicher abgelegt. Wenn du jetzt 2000 Einträge im Array haben willst ergibt das 2000 * SizeOf(Record). Das Hauptproblem besteht jetzt darin so viel zusammenhängenden Speicher zu finden. Wenn du das ganze über TList machst, forderst du für jeden Record neu speicher an und die Records stehen nicht unmittelbar hintereinander im Speicher. (und viele kleinen Stücken sind häufiger als ein großes zusammenhängendes stück)

Daraus folgt: Einfach alles auf TList umstellen und dein Problem ist gelöst.
Anwendungsbeispiel:
Delphi-Quellcode:
PMeinRecord = ^TMeinRecord;
TMeinRecord = record
  MeineVar: integer;
  .
  .
  .
end;
[...]
  fListe: TList; //diese natürlich mit "fliste := TList.Create" initialisieren
[...]
var LRecord: PMeinRecord;
begin
  new(LRecord);
  LRecord^.MeineVar := 0; //oder halt deine values;
  [...]
  fListe.Add(LRecord); //Kann dann später wieder über "PMeinRecord(fListe.Items[x])^.MeineVar" etc. angesprochen werden.
end;
Zum freigeben dann einfach
Delphi-Quellcode:
var LCount: Integer;
begin
  for LCount := 0 to fListe.Count - 1 do
    dispose(fListe.Items[LCount]);
  fListe.Free;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 10:35 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