Verwendung von "absolute"

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

Verwendung von "absolute"

Beitrag von Martin V »

Ich habe in einem älteren Programm, das ich auf einem anderen Delphi-Clone geschrieben habe, eine Mengen von Daten, die ich anfangs in einem Rutsch definiert habe (heute würde ich das anders schreiben)

var
Var1 : byte;
Var2 : integer;
Var3 : boolean;

Ich habe dann diese Variablenliste testweise in einen Record eingeklammert und mit sizof(record) die Größe der Daten im Speicher ausgeben lassen.

type
tGesamteDaten = array[1..DatenGroesse] of byte;
var
GesamteAlteDaten : tGesamteDaten absolute Var1;
GesamteNeueDaten : tGesamteDaten;

Jetzt kann ich in einem Rutsch die Daten kopieren und vergleichen.

Seht Ihr Probleme bei Freepascal? D.h. sind die Variablen wirklich sicher immer so im Hauptspeicher, wie in der Reihenfolge des Programmquelltextes?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Verwendung von "absolute"

Beitrag von mschnell »

Der Compiler darf die Elemente eines "nomalen" Records beliebig anlegen. da kann man sich nicht drauf verlassen.

Um eine deterministische Anordnung der Felder zu bekommen, muss man ein "packed record" anlegen.

Und dann ist es immer noch ein unterschied ob man eine "high-endian" oder eine "low endian" CPU verwendet.

-Michael

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Verwendung von "absolute"

Beitrag von Michl »

Martin V hat geschrieben:Seht Ihr Probleme bei Freepascal? D.h. sind die Variablen wirklich sicher immer so im Hauptspeicher, wie in der Reihenfolge des Programmquelltextes?
Falls ich dich richtig verstanden habe, gehst du davon aus, dass Variablen außerhalb eines Records nacheinander im Speicher liegen.

Ich denke nicht, dass man sich darauf verlassen kann. Je nach System und Fragmentierung, vergibt es den angeforderten Speicher eher geordnet oder zufällig.

Habe es eben mal getestet, bei mir funktioniert das zwar mit globalen, nicht jedoch mit lokalen Variablen (diese liegen dann im Stack). Außerdem musste ich noch Füll-Bytes einfügen (64bit Windows 7, AMD und Intel CPU), um die richtigen Adressen zu erhalten (den lokalen Test habe ich aus Gründen der Übersichtlichkeit entfernt):

Code: Alles auswählen

program project1;
 
type
  TSomeRecord = packed record
    Var1: Byte;
    FillDummy1: array[1..15] of Byte;
    Var2: Integer;
    FillDummy2: array[4..15] of Byte;
    Var3: Boolean;
    FillDummy3: array[1..15] of Byte;
  end;
  TGesamteDaten = array[1..Sizeof(TSomeRecord)] of Byte;
 
var
  aVar1: Byte;
  aVar2: Integer;
  aVar3: Boolean;
  aVarNew: TSomeRecord;
  GesamteNeueDaten: TGesamteDaten;
  GesamteAlteDaten : TGesamteDaten absolute aVar1;
  i: Integer;
 
begin
  aVar1 := 10;
  aVar2 := 11;
  aVar3 := True;
  aVarNew.Var1 := 20;
  aVarNew.Var2 := 21;
  aVarNew.Var3 := True;
  Move(aVarNew, GesamteNeueDaten[1], SizeOf(TSomeRecord));
  for i := Low(GesamteAlteDaten) to High(GesamteAlteDaten) do
    WriteLn(i:2, ': ', GesamteAlteDaten[i], ' - ', GesamteNeueDaten[i]);
end.

MMn, kann man sowas mal zu Testzwecken machen, aber nicht in einer ordentlichen Anwendung.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Verwendung von "absolute"

Beitrag von wp_xyz »

Wenn du schon einen übergestülpten Record verwendest, um die Daten irgendwohin zu kopieren, dann deklariere deine Daten doch gleich innerhalb eines Records:

Code: Alles auswählen

type
  TAppData = record
    Var1 : byte;
    Var2 : integer;
    Var3 : boolean;
  end;
 
var
  data: TAppData = (
    Var1: 0;
    Var2: 100;
    Var3: true
  );

Dann hast du alles übersichtlich beisammen und kannst alles sauber initialisieren (ok - das geht auch getrennt...) und kopieren/speichern/laden. Und es gibt keine Unsicherheit wegen Speicherfragmentierung etc. Kostet dich halt etwas mehr Tastenanschläge.

Antworten