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?
Verwendung von "absolute"
-
- 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"
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
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
Re: Verwendung von "absolute"
Falls ich dich richtig verstanden habe, gehst du davon aus, dass Variablen außerhalb eines Records nacheinander im Speicher liegen.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?
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;
Re: Verwendung von "absolute"
Wenn du schon einen übergestülpten Record verwendest, um die Daten irgendwohin zu kopieren, dann deklariere deine Daten doch gleich innerhalb eines Records:
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.
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.