AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein SetLength / Getmem / AllocMem out of memory Problem
Thema durchsuchen
Ansicht
Themen-Optionen

SetLength / Getmem / AllocMem out of memory Problem

Ein Thema von greenmile · begonnen am 7. Okt 2009 · letzter Beitrag vom 9. Okt 2009
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.505 Beiträge
 
Delphi 12 Athens
 
#18

Re: SetLength / Getmem / AllocMem out of memory Problem

  Alt 8. Okt 2009, 11:06
Die über 800 MB dann so im RAM behalten zu wollen ist dann aber wohl eher ein Designfehler in der Anwendung.

Hier würde sich dann eine MMF anbieten ... diese in der entsprechenden Größe erstellt

dann einfach nur den Bereich z.B. 4096 Bytes ab Position sound so in den Speicher mappen, die Daten da reinkopieren und dann den Bereich eventuell gleich wieder freigeben.


für alle möglichen anderen Fälle ginge z.B. sowas (also ab Delphi 2006)
dieses stellt quasi ein einfaches dynamisches Array mit gesplittetem Datenbereich dar
Delphi-Quellcode:
Type TSplittArray<Typ> = Record
  Private
    Var _SplittSize: Integer;
      _Data: Array of Array of Typ;
    Function Getter(Index: Integer): Typ; Inline;
    Procedure Setter(Index: Integer; Const Value: Typ); Inline;
  Public
    Procedure SetSplittSize(i: Integer);
    Procedure SetLength (i: Integer);
    Function Length: Integer; Inline;
    Function High: Integer; Inline;
    Property Value[Index: Integer]: Typ Read Getter Write Setter; Default;

    //Procedure Push(Const Value: Typ);
    //Function Pop: Typ;
  End;

Function TSplittArray<Typ>.Getter(Index: Integer): Typ;
  Begin
    Result := _Data[Index div _SplittSize, Index mod _SplittSize];
  End;

Procedure TSplittArray<Typ>.Setter(Index: Integer; Const Value: Typ);
  Begin
    _Data[Index div _SplittSize, Index mod _SplittSize] := Value;
  End;

Procedure TSplittArray<Typ>.SetSplittSize(i: Integer);
  Begin
    If Assigned(_Data) Then System.Error(reInvalidOp);
    _SplittSize := i;
  End;

Procedure TSplittArray<Typ>.SetLength(i: Integer);
  Var i2: Integer;

  Begin
    i2 := System.High(_Data);
    System.SetLength(_Data, (i - 1) div _SplittSize + 1);
    For i2 := i2 to System.High(_Data) - 1 do
      System.SetLength(_Data[i2], _SplittSize);
    If i > 0 Then
      System.SetLength(_Data[System.High(_Data)], i mod _SplittSize);
  End;

Function TSplittArray<Typ>.Length: Integer;
  Var i: Integer;

  Begin
    i := System.High(_Data);
    Result := i * 1000 + System.Length(_Data[i]);
  End;

Function TSplittArray<Typ>.High: Integer;
  Begin
    Result := Length - 1;
  End;

{Procedure TSplittArray<Typ>.Push(Const Value: Typ);
  Var i: Integer;

  Begin
    i := Length;
    SetLength(i + 1);
    Setter(i - 1, Value);
  End;

Function TSplittArray<Typ>.Pop: Typ;
  Var i: Integer;

  Begin
    i := High;
    Result := Getter(i);
    SetLength(i);
  End;}
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 07:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz