Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Größe in Bytes eines Arrays bestimmen

  Alt 8. Aug 2008, 10:23
wie gesagt, erstmal müßte man wissen in welchem Format du die Arraydaten (in dem Stream) speichern willst und dann könnte man auch vorausberechnen welche Größe das ergibt.


aber mal zu den Typen...

zwecks der Speicherung macht es sich bestimmt besser auf feste Typengrößen zu setzen und die Speicherausrichtung zu eliminieren
(z.B. kan man die Speicherausrichtung änder und Integer war unter Delphi 1 16 Bit, jetzt ist es 32 Bit und in einem 64-Bit-Delphi wird es wohl 64 Bit sein)

und da Delphi ja bei seinen Arrays die Größe mit speichert, is es da nötig dieses nochmals im Record anzugeben.
(ok, so kann man aunfach auf TCalibData.NoOfRegItems, statt auf Length(TCalibData.RegItems) zugreifen)
und sind diese Werte immer identisch? (bräuchte man nur NoOf.. speichern ung könnte Length(array) einfach ignorieren)
Delphi-Quellcode:
TCalibPoint = packed Record
  Active : Boolean;
  x, y : Single;
end;

TCalibArray = packed Array of TCalibPoint;

TCalibData = packed Record
  //NoOfRegItems : LongInt; entspricht doch Length(TCalibData.RegItems)
  RegItems : packed Array of Double;
  //NoOfCItems : LongInt; entspricht doch Length(TCalibData.CalibArray)
  CalibArray : TCalibArray;
end;

TCalibrationArray = packed Array of TCalibData;

wenn ich jetzt einfach mal ignorieren, daß die Arraylänge schon im Record (NoOf...) gespeichert ist, dann so ... incl. der Längenangaben der Array's (je ein LongInt)
Delphi-Quellcode:
type TCalibPoint = packed Record
    Active : Boolean;
    x, y : Single;
  end;

  TCalibArray = packed Array of TCalibPoint;

  TCalibData = packed Record
    NoOfRegItems : LongInt;
    RegItems : packed Array of Double;
    NoOfCItems : LongInt;
    CalibArray : TCalibArray;
  end;

  TCalibrationArray = packed Array of TCalibData;

var CalibrationArray: TCalibrationArray;
  Size, i, i2: LongInt;


// Length(CalibrationArray)
// CalibrationArray[i].NoOfRegItems CalibrationArray[i].NoOfCItems
Size := SizeOf(LongInt)
  + Length(CalibrationArray) * 2 * SizeOf(LongInt);

for i := 0 to High(CalibrationArray) do begin
  // Length(CalibrationArray[i].RegItems)
  Inc(Size, SizeOf(LongInt));

  // CalibrationArray[i].RegItems
  Inc(Size, Length(CalibrationArray[i].RegItems) * SizeOf(Double));

  // Length(CalibrationArray[i].CalibArray)
  Inc(Size, SizeOf(LongInt));

  for i2 := 0 to High(CalibrationArray[i].CalibArray) do begin
    // Length(CalibrationArray[i].CalibArray[i2])
    Inc(Size, SizeOf(LongInt));

    // CalibrationArray[i].CalibArray[i2]
    Inc(Size, Length(CalibrationArray[i].CalibArray[i2]) * SizeOf(TCalibPoint));
  end;
end;
$2B or not $2B
  Mit Zitat antworten Zitat