Frage Delphi Datentyp zu groß: überschreitet 2 GB in Berlin Update 2


Ich habe eine Einheit, die sowohl für Delphi als auch für Lazarus ist. In Lazarus kompiliert die Einheit ohne Ausnahme, aber in Delphi gibt es mir Fehler-Typ zu groß: überschreitet 2 GB. Unten ist der Code:

unit UType;

{$ifdef FPC}
 {$MODE delphi}{$H+}
{$endif}

interface


type
  TFreqType = Extended;

  TFreqCutArray = Array [0..0]of TFreqType;

  PFreqCutArray = ^TFreqCutArray;

  FilterOrder = Integer;

  TAS_Sample = Extended;

  TAS_SampleArray = Array[0..High(Integer) div Sizeof(TAS_Sample) - 1] of TAS_Sample;

  PTAS_SampleArray = ^TAS_SampleArray;

  TAS_Float = Extended;

  TComplex = record
    Re, Im: TAS_Sample; // Z = Re + i*Im
    end;

  PComplex = ^TComplex;
  TComplexArray = Array[0..High(Integer) div Sizeof(TComplex) - 1] of TComplex;//here Delphi gives the error

  PComplexArray = ^TComplexArray;
  FilterProc = function(V: TAS_Sample): TAS_Sample of object;

implementation

end.

Ich benutze Berlin Update 2, mit dem gleichen Code in Lazarus kompiliert es ohne Fehler.


9
2018-04-04 07:19


Ursprung


Antworten:


Dies scheint ein Kompilierfehler zu sein. Sie können den Typ wie folgt deklarieren:

TComplexArray = Array[0..67108862] of TComplex;

und der Compiler akzeptiert die Deklaration. Beachten Sie, dass 67108862 = High(Integer) div Sizeof(TComplex) - 1.

Sie können es vermeiden, die obere Grenze hart zu codieren, indem Sie eine Konstante deklarieren:

const
  ComplexArrayUpperBound = High(Integer) div Sizeof(TComplex) - 1;

type
  TComplexArray = Array[0..ComplexArrayUpperBound] of TComplex;

Diese Art der Typdeklaration ist heutzutage sehr unmodern. Ich würde dringend empfehlen, dass Sie dynamische Arrays verwenden. Dadurch erhalten Sie eine automatische Bereinigung des dynamischen Arbeitsspeichers und ermöglichen dem Compiler das Hinzufügen von Bereichsüberprüfungscode für all Ihren Array-Zugriff. Dieser letzte Punkt ist wichtig, da er Sie frühzeitig vor Bereichsfehlern in Ihrem Code warnt.

Wenn Sie die Arrays nicht zuweisen und stattdessen diese Typen zum Aktivieren der Array-Indizierung deklarieren, ist es wahrscheinlich einfacher zu verwenden {$POINTERMATH ON}.

Außerdem würde ich vorschlagen, dass Sie verwenden Double Anstatt von Extended. Es ist sehr unwahrscheinlich, dass Sie das 10 Byte benötigen würden Extended tippen und wechseln zu Double wird die Hälfte Ihrer Speicheranforderungen. Wegen der Ausrichtung, Ihr TComplex ist 32 Bytes groß, aber a Double basierte Version wäre 16 Bytes. Diese Einsparung führt zu einem erheblichen Leistungsvorteil aufgrund der besseren Nutzung des Caches.


9
2018-04-04 07:46



Hier ist eine alte Deklaration, die gut kompiliert:

  PUserInfo0Arr = ^TUserInfo0Arr;
  TUserInfo0Arr = array[0..MaxInt div SizeOf(TUserinfo0) - 1] of TUserinfo0;

Ein paar Dutzend davon sind in meinem Code, ich bevorzuge jetzt die Inc (PUserInfo0Arr).


-1
2018-04-05 04:30